Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][mysql] Problem - Rozwiązany, Skrypt wywala sie po 3700 rekordach.
lunlog
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Witam, mam mały problem dot. wstawiania danych do bazy (1M wierszy), klient którego używam jest w wersji 3.23.39. Dane generuje lokalnie za pomoca skryptu php:

  1. <?php
  2.  
  3. //czesc generujaca wspolrzedne, najpierw "x" potem "y" na koncu "z".
  4.  
  5. include ('1.php'); // connection script include
  6.  
  7. $limit = 100;
  8.  
  9. for( $pozz = 1; $pozz <= $limit; $pozz++ )
  10. for( $pozy = 1; $pozy <= $limit; $pozy++ )
  11. for( $pozx = 1; $pozx <= $limit; $pozx++ ){
  12.  
  13. //$wl -zmienna okreslajaca roznorodnosc asteroid
  14.  
  15. $wl=rand(1,1000);
  16. unset($name, $minerals1, $minerals2);
  17.  
  18. //czesc generujaca rozne typy asteroid oraz wielkosci mineralow w zaleznosci od ro
    zmiaru
  19.  
  20. if($wl>900) {
  21.  $size=rand (227,255);
  22.  $minerals1=rand (58300,65500);
  23.  $minerals2=rand (58300,65500); }
  24. else if($wl>800) {
  25.  $size=rand (199,226);
  26.  $minerals1=rand (51100,58299);
  27.  $minerals2=rand (51100,58299); }
  28. else if($wl>700) {
  29.  $size=rand (171,198);
  30.  $minerals1=rand (43900,51099);
  31.  $minerals2=rand (43900,51099); }
  32. else if($wl>600) {
  33.  $size=rand (143,170);
  34.  $minerals1=rand (36700,43899);
  35.  $minerals2=rand (36700,43899); }
  36. else if($wl>500) {
  37.  $size=rand (115,142);
  38.  $minerals1=rand (29500,36699);
  39.  $minerals2=rand (29500,36699); }
  40. else if($wl>400) {
  41.  $size=rand (87,114);
  42.  $minerals1=rand (22300,29499);
  43.  $minerals2=rand (22300,29499); }
  44. else if($wl>300) {
  45.  $size=rand (59,86);
  46.  $minerals1=rand (15100,22299);
  47.  $minerals2=rand (15100,22299); }
  48. else if($wl>200) {
  49.  $size=rand (31,58);
  50.  $minerals1=rand (7900,15099);
  51.  $minerals2=rand (7900,15099); }
  52. else if($wl>100) {
  53.  $size=rand (3,30);
  54.  $minerals1=rand (700,7899);
  55.  $minerals2=rand (700,7899); }
  56. else{
  57. $size=NULL;
  58. $minerals1=NULL;
  59. $minerals2=NULL; 
  60.  }
  61.  
  62. // generacja nazwy
  63. if ($wl>100) {
  64. $ile = rand(3,5); //ile literek w nazwie
  65. $sam = array('a', 'u', 'e', 'i', 'o'); //samogloski
  66. $spo = array('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'w', 'x', 'y', 'z', 'q'); //spolgloski
  67. $name = "";
  68.  
  69. for($i = 0; $i < $ile; $i++) 
  70.  
  71. { 
  72. if($i % 2 == 1) 
  73.  {
  74. if($i == 0)
  75.  {
  76.  $name .= strtoupper($sam[rand(0, count($sam)-1)]);
  77.  }  
  78. else
  79.  {
  80. $name .= $sam[rand(0, count($sam)-1)];
  81. }
  82. } 
  83. else 
  84.  {
  85.  if($i == 0)
  86.  {
  87. $name .= strtoupper($spo[rand(0, count($spo)-1)]);
  88. }
  89.  else
  90.  {
  91. $name .= $spo[rand(0, count($spo)-1)];
  92. }
  93. }}}
  94.  
  95. // koniec generowania nazwy
  96.  
  97.  
  98.  
  99. // $name $size $minerals1 $minerals2 $pozx $pozy $pozz -zmienne umieszczane w bazie danych
  100.  
  101.  
  102. $insert = "INSERT INTO tab_ast (name, pozx, pozy, pozz, size, min1, min2) VALUES ('$name', '$pozx', '$pozy', '$pozz', '$size', '$minerals1', '$minerals2')";
  103. query($insert);
  104.  
  105. /*wyjscie - opcjonalnie
  106.  
  107. echo "Poz X =$pozx , Poz Y =$pozy , Poz Z = $pozz <br>";
  108. echo "Rozmiar Asteroidy to $size , nazwa: $name <br><br>";
  109. */
  110.  
  111. }
  112.  
  113. ?>


Lecz tutaj pojawia się problem. Skrypt wstawia maksymalnie 100 wierszy, po czym przestaje odpowiadać. Przypuszczam że problem lezy w delay_key_writes którego bufor zapycha się pod nawałem informacji ze skryptu php (10k wieszy generuje się w około 35 sekund). Jak mogę tą funkcję wyłączyć lub też jakie moga byc inne przyczyny takiego zachowania się bazy mysql ? Może mam coś nie tak ze skryptem ?

Ten post edytował lunlog 21.04.2006, 08:37:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
spenalzo
post
Post #2





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


set_time_limit" title="Zobacz w manualu php" target="_manual
Go to the top of the page
+Quote Post
lunlog
post
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Skrypt nie wywala sie z powodu timeout. Moge go uruchomic nawet na sekunde a i tak wstawi tylko 100 rekordow do bazy. Moge go rowniez uruchomic na godzine 3600 sekund a i tak wstawi tylko 100 rekordow. Wiec timeout odpada...
Go to the top of the page
+Quote Post
spenalzo
post
Post #4





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


mysql_error" title="Zobacz w manualu php" target="_manual
Może mysql gdzies sie wysypuje?
Go to the top of the page
+Quote Post
lunlog
post
Post #5





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Mozliwe, ale zeby za kazdym razem wstawial nie wiecej, nie mniej tylko 100 rekordow ? To bardziej podpada pod jakis blad w ustawieniach zmiennych servera mysql, a jedyna zmienna ustawiona w moim serverze na wartosc 100 to delay_key_write, czy tam jakas funkcja zalezna od niej...

Ma ktos pomysl jak wylaczyc ta funkcje ?

w manualach wyczytalem ze mozna tego dokonac poleceniem SET ale nie zabardzo wiem jak... i gdzie, probowalem zdefiniowac zmienna w zakladce [mysqld] w pliczku my.ini aczkolwiek tylko polozylem server... wiec juz nie wiem kompletnie co mam z tym zrobic...

Jak bede w domu to sprawdze czy mysql wysypuje jakies konkretne bledy po dodaniu tego 100-nego rekordu.
Go to the top of the page
+Quote Post
spenalzo
post
Post #6





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Przyjrzyj sie temu fragmentowi kodu - tak długo, aż nie znajdziesz 2 bŁędów (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
  1. <?php
  2.  
  3. $limit = 100;
  4.  
  5. for( $pozx = 1; $pozz <= $limit; $pozz++ )
  6. for( $pozy = 1; $pozy <= $limit; $pozy++ )
  7. for( $pozz = 1; $pozx <= $limit; $pozx++ ){
  8. ?>


Jak je poprawisz, skrypt powinien ruszyc - bo u mnie przed poprawą sie zapętlał.

Natomiast ilość rekordów nie ma specjalnego znaczenia - ja u siebie dodaje 10 000 rekordów w czasie 4 sekund poprzez niezależne INSERTy (10 000 zapytan).

Ten post edytował spenalzo 19.04.2006, 17:00:31
Go to the top of the page
+Quote Post
lunlog
post
Post #7





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Sprawdze sobie w domqu... po 23 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) teraz work work work (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)


//edit

2 bledy ?, ja tutaj tylko bym wstawil wartosci liczbowe i wywalil zmienna $limit, bo wczesniej tak dzialalo dobrze... a 2 blad ? nie mam pojecia... w tym kawalku ktory zaznaczyles nie ma } ale to pewnie przypadek....

Ten post edytował lunlog 19.04.2006, 18:09:55
Go to the top of the page
+Quote Post
spenalzo
post
Post #8





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


"Znajdź dwa szczegóły różniące poniższe obrazki"
  1. <?php
  2. $limit = 100;
  3.  
  4. for( $pozx = 1; $pozz <= $limit; $pozz++ )
  5. for( $pozy = 1; $pozy <= $limit; $pozy++ )
  6. for( $pozz = 1; $pozx <= $limit; $pozx++ ){
  7. ?>


  1. <?php
  2. $limit = 100;
  3.  
  4. for( $pozz = 1; $pozz <= $limit; $pozz++ )
  5. for( $pozy = 1; $pozy <= $limit; $pozy++ )
  6. for( $pozx = 1; $pozx <= $limit; $pozx++ ){
  7. ?>


(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
lunlog
post
Post #9





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Diabel tkwi w szczegolach... podobno (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) dzieki za pomoc, sprawdze sobie jak to dziala i czy dalej bedzie wstawialo tylko 100 pierwszych (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Nie spodziewalbym sie ze tutaj bede mial blad...


//edit

Tak czy siak, skrypt nie wywala się po 100 wpisanych rekordach tak jak wcześniej... teraz wywala się po 3700 wstawionych rekordach (ironia), jest lepiej ale to jeszcze nie jest to... docelowo skrypt powinien wstawić 1M danych.

Ma ktoś jakiś pomysł co wywala mi skrypt tym razem ? zmieniłem

set-variable=key_buffer=16M

na

set-variable=key_buffer=256M

ale to nie pomogło... może mój problem wynika ze sposobu w jaki lacze sie z baza danych ? po tych 3700 rekordach mysql wywala mi bledy ze nie moze sie polaczyc z baza danych...

  1. <?php
  2.  
  3. //tutaj deklaracja zmiennych - wykasowana ofcorz (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
  4.  
  5. function query($query)
  6. {
  7. global $db_host, $db_user, $db_pass, $db_name;
  8. $link = mysql_connect("$db_host", "$db_user", "$db_pass");
  9. mysql_select_db("$db_name", $link);
  10. $result = mysql_query("$query", $link);
  11. mysql_close($link);
  12. return $result;
  13. }
  14.  
  15.  
  16. ?>



A teraz pytanie z innej beczki, może tem problem który mam w tej chwili, wlewanie maksymalnie 3700 rekordow do bazy danych wiąże się z jakimis ustawieniami mojego serwera ? Na wypadek jak ktoś byłby tak wielkoduszny i chciał stworzyć mi pliczek importu dla tego skryptu to podaje kod tabeli do której wlewane sa dane (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

  1. CREATE TABLE `tab_ast` (
  2. `id` mediumint(6) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` varchar(7) DEFAULT 'no name',
  4. `pozx` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  5. `pozy` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  6. `pozz` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  7. `size` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  8. `min1` smallint(5) UNSIGNED NOT NULL DEFAULT '0',
  9. `min2` smallint(5) UNSIGNED NOT NULL DEFAULT '0',
  10. `user_id` mediumint(6) UNSIGNED NOT NULL DEFAULT '0',
  11. PRIMARY KEY (`id`)
  12. ) TYPE=MyISAM AUTO_INCREMENT=1 ;


Jakby cos to prosze o informacje na PW (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) lub w tym temacie.

Ten post edytował lunlog 20.04.2006, 00:34:51
Go to the top of the page
+Quote Post
spenalzo
post
Post #10





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Nadal nie napisałeś, czy mysql rzuca jakieś błędy po uzyciu mysql_error. (
  1. <?php
  2. mysql_query("cos") or die("Błąd mysql: ".mysql_error());
  3. ?>


Natomiast ta zmienna nie sądze zeby miała wpływ, gdyż służy ona do czegoś innego. Jak to nie pomoże, to zobacz czy w odpowiednim miejscu masz ustawiony insert.

A jak to nie pomoze to zmien mysql-a na jakas wersje 4.x.x
Go to the top of the page
+Quote Post
lunlog
post
Post #11





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Po jakimś czasie wywala to.. po kilku sekundach.

Kod
Warning: Can't connect to MySQL server on 'localhost' (10048) in C:\FoxServ\www\1.php on line 11

Warning: MySQL Connection Failed: Can't connect to MySQL server on 'localhost' (10048) in C:\FoxServ\www\1.php on line 11

Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in C:\FoxServ\www\1.php on line 12

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in C:\FoxServ\www\1.php on line 13
Błšd mysql: Can't connect to MySQL server on 'localhost' (10048


i nic pozatym...

moj obecny plik 1.php

  1.  
  2. <?php
  3.  
  4. $db_host='';
  5. $db_user='';
  6. $db_name='';
  7. $db_pass='';
  8.  
  9. function query($query)
  10. {
  11. global $db_host, $db_user, $db_pass, $db_name;
  12. $link = mysql_connect("$db_host", "$db_user", "$db_pass");
  13. mysql_select_db("$db_name", $link);
  14. $result = mysql_query("$query", $link) or die("Błšd mysql: ".mysql_error());
  15. mysql_close($link);
  16. return $result;
  17. }
  18.  
  19. ?>
Go to the top of the page
+Quote Post
popo
post
Post #12





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 15.07.2005

Ostrzeżenie: (0%)
-----


Cytat
Warning: MySQL Connection Failed: Can't connect to MySQL server on 'localhost' (10048)

oznacza ze nie mozna nawiazac polaczenia z serwerem mysql na localhoscie

radze sprawdzic czy aby napewno mysql dziala (czy demon jest odpalony i nasluchuje polaczen)
Go to the top of the page
+Quote Post
lunlog
post
Post #13





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Tyle to ja wiem, hehe. Usluga podczas odpalania skryptu dziala na pewno...
Go to the top of the page
+Quote Post
spenalzo
post
Post #14





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Wiesz.... jak wywolujesz w pętli połączenie do MySQL to cóż... chcesz otworzyć milion połączen?


Teraz widzisz dlaczego trzeba podawać błędy jakie generuje skrypt - jakbys pokazal od rauz, to temat byłby rozwiazany 2dni temu (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował spenalzo 20.04.2006, 16:37:33
Go to the top of the page
+Quote Post
lunlog
post
Post #15





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


O.o ze co ? zapytanie wywoluje w petli przed wyslaniem danych do bazy... nie rozumiem... jak w pentli ? to to sie robi inaczej ? nie kumam cza-czy...

Macie jakies propozycja naprawy tego ? Gdzie mam blad w skrypcie generujacym dane czy w pliku z ktorego korzysta ten plik generujacy ?

Query przeciez sie zamyka po skonczeniu wysylania danych do bazy. (chyba)

//edit

if (!query($link); {

query($link); }

else {

}

cos takiego ? styknie ? (pisze na szybko w pracy (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) )

Ten post edytował lunlog 20.04.2006, 20:22:49
Go to the top of the page
+Quote Post
spenalzo
post
Post #16





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Nie, nie coś takiego.

Przeanalizuj sobie swoją funkcje QUERY, a potem zobacz gdzie ją używasz.

Nie szkodzi, że sei zamyka polaczenie - jak dla mnie sam fakt wywołania miliona polaczń jest bez sensu... Polaczenie nawiazuje sie na poczatku skrypyu, a nie przy kazdym wywolaniu zapytania.

Ten post edytował spenalzo 20.04.2006, 20:27:37
Go to the top of the page
+Quote Post
lunlog
post
Post #17





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.04.2006

Ostrzeżenie: (0%)
-----


Dobra pokombinuje i powiem jak mi poszło..... chociaz nie wiem dokładnie jak to mam zrobić... ale dzięki za namiary gdzie leży problem.


//edit

Działa wkońcu ! ha, zmieniłem układ skryptu ładowania w ten sposób że łączy się z serverem tylko raz... i query wykonuje w momencie kiedy musi... znaczy sie połączy się z baza danych i rozłączy dopiero po zakończeniu funkcji query (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Na początku skrypt wstawił mi o 72k wierszy za duzo... ale to chyba moja wina bo zostawiłem jakies smieci w bazie danych... ale za 2 razem wstawił równo 1M (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) i to w czesie dużo krutszym niż sie spodziewałem... wywaliłem cały output ze skrypu, odpaliłem skrypt i wyłączyłem przegladarkę (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Dziękuje bardzo za pomoc (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) sam pewnie bym sobie nie poradził. Niech szybkie łącza oraz dobrze napisane skrypty będa z Wami (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Ten post edytował lunlog 20.04.2006, 22:53:28
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 15:34