Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] pętla foreach itp..., duże zużycie pamięci...
Kazimir
post 1.07.2008, 05:41:30
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 1.07.2008

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


Witam,
problem polega na tym, iż php alokuje w apachu zasoby do czasu zakonczenia pętli. W szybkim tempie przyrasta ilość zajętej pamięci. Jak można rozwiązać ten problem? Jest możliwość zwalniania zasobów po zakończeniu każdej iteracji? Czy powodem może być duża ilość zmiennych? Czy zastąpienie ich przez array() coś tu pomoże?

Dzięki za informacje smile.gif

Ten post edytował Kazimir 2.07.2008, 00:33:34
Go to the top of the page
+Quote Post
Cysiaczek
post 1.07.2008, 06:19:11
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Tak, jest taka możliwość. Po prostu wykonaj unset(). Jak konkretnie? Nie ma kodu, nie ma konkretnej podpowiedzi.

Pozdrawiam


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Kazimir
post 1.07.2008, 06:44:50
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 1.07.2008

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


sam kod działa bez problemu wiec nie podaje całości (nie mam w tej chwili do niego dostępu), więc proszę o nie szukanie literówek tylko skupienie sie na temacie - 100% zajęcie pamięci po przetworzeniu ok 2000 linków... deklarowałem unset tak jak poniżej. Możliwe, że coś skopałem...

  1. <?php
  2. include('simple_html_dom.php');
  3.  
  4. //załadowanie 400,000 linkow
  5. $linki = file('xyz.txt');
  6.  
  7. for ($licznik=0;licznik>=10000;$licznik++){
  8.  
  9. $dom = pobranie strony ('$linki[$licznik]')
  10.  
  11. //parsowanie
  12. $zmienna..
  13. .
  14. .
  15. ok 30 zmiennych
  16. .
  17. .
  18.  
  19. //zapisa do pliku zmiennych do 
  20. $F = fopen('plik.csv','a');
  21. fwrite($F,"$zmienna1;$zmienna2....");
  22. fclose($F);
  23.  
  24. //dla wszystkich zmiennych
  25. unset($zmienna);
  26. }
  27.  
  28. ?>


Dzieki za informacje smile.gif

Ten post edytował Cysiaczek 1.07.2008, 07:03:20
Powód edycji: poprawiem bbcode (cysiaczek)
Go to the top of the page
+Quote Post
cbagov
post 1.07.2008, 09:05:24
Post #4





Grupa: Zarejestrowani
Postów: 181
Pomógł: 18
Dołączył: 19.04.2008

Ostrzeżenie: (10%)
X----


Musisz dzielic na pakiety a nie pchac cala kupe linkow na raz. Najlepiej robic to przy zapisie od razu z odpowiednia klasyfikacja. Inaczej mozesz sie pozegnac z odpowiednim czasem wykonania oraz pamiecia.
Go to the top of the page
+Quote Post
dr_bonzo
post 1.07.2008, 11:46:40
Post #5





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Kazimir: bez calego kodu trudno cokolwiek powiedziec, nie wiem czego w srodku uzywasz, bo moze nie mozna zwolnic pamieci ktora uzywasz, albo inaczej uzyc funkcji php, albo.... memory_get_usage() i sprawdzasz co sie nie zwalnia itp.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Kazimir
post 2.07.2008, 00:15:08
Post #6





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 1.07.2008

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


kod poniżej... wychodzi na to ze zasoby nie są zwalniane :/... parsowanie 1000 stron -> 640MB pamięci... dzięki za wszelkie informacje... btw. pierwsze kroki z php :P ... także prosze o wyrozumiałość :)

  1. <?php
  2. include('./simple_html_dom.php');
  3.  
  4. $i=0;
  5. while ($i<365000) {
  6. $linki=file("./pliki/plik.$i"); 
  7.  
  8. foreach ($linki as &$value) {
  9. $link = substr($value,0,-1);
  10. $dom = file_get_dom("$link");
  11. foreach($dom->find('table[class=kodywynik] tr') as $node){
  12. $item = trim($node->find('td',0)->plaintext);
  13. $podziel = explode("r\n", $item);
  14. $miasto = substr($podziel[0],13);
  15. $gmina = substr($podziel[1],7);
  16. $powiat = substr($podziel[2],8);
  17. $wojewodztwo = substr($podziel[3],13);
  18. }
  19.  
  20. if ($miasto=="") continue;
  21.  
  22. $re = $dom->find('#wynik_g2s b', 0)->plaintext;
  23. $ok = $dom->find('#wynik_g2s b', 1)->plaintext;
  24. $ap = $dom->find('#wynik_g2s b', 2)->plaintext;
  25.  
  26.  
  27. $adresr = $dom->find('#adres', 0)->plaintext;
  28. $adreso = $dom->find('#adres', 1)->plaintext;
  29. $adresa = $dom->find('#adres', 2)->plaintext;
  30.  
  31. unset($dom);
  32.  
  33.  
  34.  
  35. $daner = explode("r\n", $adresr);
  36. unset($adresr);
  37. $ulicar = substr($daner[1],12);
  38. $kodr = substr($daner[2],16,6);
  39. if ($kodr==" ") $kodr="";
  40. $mir = substr($daner[2],38);
  41. $telr1 = substr($daner[3],18);
  42. $telr2 = substr($daner[4],18);
  43. $faxr = substr($daner[5],17);
  44. $nrkontar = substr($daner[7],19);
  45. $bankobslugujacyr = substr($daner[8],18);
  46.  
  47.  
  48. $daneo = explode("r\n", $adreso);
  49. unset($adreso);
  50. $ulicao = substr($daneo[1],12);
  51. $kodo = substr($daneo[2],16,6);
  52. $mio = substr($daneo[2],38);
  53. if ($kodo==" ") $kodo="";
  54. $telo1 = substr($daneo[3],18);
  55. $telo2 = substr($daneo[4],18);
  56. $faxo = substr($daneo[5],17);
  57. $nrkontao = substr($daneo[7],19);
  58. $bankobslugujacyo = substr($daneo[8],18);
  59.  
  60.  
  61. $danea = explode("r\n", $adresa);
  62. unset($adresa);
  63. $ulicaa = substr($danea[1],12);
  64. $koda = substr($danea[2],16,6);
  65. $mia = substr($danea[2],38);
  66. if ($koda==" ") $koda="";
  67. $tela1 = substr($danea[3],18);
  68. $tela2 = substr($danea[4],18);
  69. $faxa = substr($danea[5],17);
  70. $nrkontaa = substr($danea[7],19);
  71. $bankobslugujacya = substr($danea[8],18);
  72.  
  73.  
  74. $F = fopen("t1.csv","a");
  75. fwrite($F,"'$miasto';'$gmina';'$powiat';'$wojewodztwo';
  76. '$re';'$ulicar';'$kodr';'$mir';'$telr1';'$telr2';'$faxr';'$nrkontar';
  77. '$bankobslugujacyr'\n'$miasto';'$gmina';'$powiat';'$wojewodztwo';
  78. '$ok';'$ulicao';'$kodo';'$mio';'$telo1';'$telo2';'$faxo';'$nrkontao';
  79. '$bankobslugujacyo'\n'$miasto';'$gmina';'$powiat';'$wojewodztwo';'$ap';
  80. '$ulicaa';'$koda';'$mia';'$tela1';'$tela2';'$faxa';'$nrkontaa';'$bankobslugujacya'\n");
  81. fclose($F);
  82.  
  83. unset($link);
  84. unset($node, $item, $podziel);
  85. unset($daner, $daneo, $danea);
  86. unset($miasto, $gmina, $powiat, $wojewodztwo, $re,
  87.  $ulicar, $kodr, $mir, $telr1, $telr2, $faxr, $nrkontar, 
  88. $bankobslugujacyr, $ok, $ulicao, $kodo, $mio, $telo1, 
  89. $telo2, $faxo, $nrkontao, $bankobslugujacyo, $ap, $ulicaa,
  90.  $koda, $mia, $tela1, $tela2, $faxa, $nrkontaa, $bankobslugujacya);
  91. unset($F);
  92. }
  93. unset($value); 
  94. $i=$i+1000;
  95. }
  96.  
  97. ?>


Ten post edytował Kazimir 2.07.2008, 00:19:35
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 17:19