magicgunnar Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 786432 bytes) Dette skyldes at jeg har to foreach løkker inni hverandre som kaller noe databasestash. Tror det blir litt mye objekter etterhvert som resultatet fra databasesøket blir lagt inn i objekter. Burde jeg slette dem med unset() når jeg ikke trenger dem lenger, eller har noen en smartere metode? Lenke til kommentar
Runar0 Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 Vil trur at unset() eller bare $object = null skal fungere Lenke til kommentar
Beethoven Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 Kanskje du bør se på spørringene dine? Lenke til kommentar
Peter Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 unset burde frigjøre minne, men tipper du kan hente mye på å heller gjøre om spørringene dine slik Beethoven sier. JOIN vil sikkert gjøre underverker. Lenke til kommentar
magicgunnar Skrevet 23. mai 2007 Forfatter Del Skrevet 23. mai 2007 Jeg bør definitivt gjøre noe med spørringene mine. Men nå har jeg prøvd å bruke både unset() og sette $object = null, men det ser ut som det ikke hjelper. Jeg bruker echo memory_get_usage() for å se på minnebruken etterhvert som scriptet eksekveres og den reduseres minimalt av disse to. Er det slik at denne koden bare vil slette en peker mens det finnes enda en peker til objektet i arrayen, hvordan sletter jeg eventuelt den pekeren også: foreach($array as $object){ $object->dosomething(); $object = null; unset($object); } Lenke til kommentar
Peter Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 Jeg bør definitivt gjøre noe med spørringene mine. Men nå har jeg prøvd å bruke både unset() og sette $object = null, men det ser ut som det ikke hjelper. Jeg bruker echo memory_get_usage() for å se på minnebruken etterhvert som scriptet eksekveres og den reduseres minimalt av disse to. Er det slik at denne koden bare vil slette en peker mens det finnes enda en peker til objektet i arrayen, hvordan sletter jeg eventuelt den pekeren også: foreach($array as $object){ $object->dosomething(); $object = null; unset($object); } 8680193[/snapback] Tviler på at det der hjelper noe særlig, objektet er antakelig en kopi. lagre heller en kopi av alle indeksene i arrayet du kan slette, og deretter unset ($array[$key]); for hver av dem. Lenke til kommentar
dabear Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 Kanskje du bør se på spørringene dine? 8679210[/snapback] Henger meg på den. Sørg for å korte ned på spørringene, over 10 stykk er som regel i overkant. Kan vi få se den aktuelle koden? Ofte kan det feks være effektivt å kjøre noe ala INSERT INTO TABLE values ('Value1','Fernando'),('Value2','Carlos'), ('Value3','Vincent') istedet for INSERT INTO TABLE values ('Value1','Fernando'); INSERT INTO TABLE values ('Value2','Carlos'); INSERT INTO TABLE values ('Value3','Vincent'); Det samme med SELECTs, prøv å kalkuler hva du skal hente ut, før du henter det ut i så få spørringer som mulig Lenke til kommentar
Peter Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 Nå skal ikke jeg spekulere i kode jeg ikke har sett, men nøstede looper har ofte med uthenting fra flere tabeller å gjøre, så i dette tilfellet tror jeg at det muligens er JOIN som mangler. Lenke til kommentar
The Red Devil Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 Som andre har sagt allerede, så bør du nok se på database spørringene dine. Det er veldeg sjeldent du trenger å kjøre spørringer i loops. I tillegg så bør du tenke på at foreach alltid lager ein kopi av arrayet, det vil sei at vist arrayet er på 1000 rader, så lager php ein til kopi på 1000 rader, som igjen effektivt er 2000 rader i minnet. Pga dette, så bør du bruke dette i php 4 while (list($key, $value) = each($array)) og dette i php 5 foreach ($array as &$key => $value) Lenke til kommentar
Ernie Skrevet 23. mai 2007 Del Skrevet 23. mai 2007 (endret) Uhhhmmm ... det her tror jeg du må utdype litt. Min meget kjappe test av påstanden indikerer noe annet. PHP <?php echo 'For init av array: '.memory_get_usage().""; $var = array(); echo 'Etter init av array: '.memory_get_usage().""; for($i = 0; $i < 1000; $i++) $var[$i] = $i; echo 'Etter for-loop: '.memory_get_usage().""; foreach ($var as $key=>$value) { if ($key === 100) echo 'Inni foreach: '.memory_get_usage().""; } echo 'Etter foreach: '.memory_get_usage().""; ?> girFor init av array: 39740 Etter init av array: 39972 Etter for-loop: 116212 Inni foreach: 116336 Etter foreach: 116336 Kjører riktignok PHP5.2, så det er mulig det er forklaringen. Edit: Testet på home.no.net hvor det kjøres 4.3.11. Samme kode gir der For init av array: 12400 Etter init av array: 12480 Etter for-loop: 72600 Inni foreach: 72848 Etter foreach: 72848 Edit2: Ja, og "foreach ($var as &$key=>$value)" går vel dårlig i PHP? Får iallfall error av det Endret 23. mai 2007 av Ernie Lenke til kommentar
magicgunnar Skrevet 24. mai 2007 Forfatter Del Skrevet 24. mai 2007 Tusen takk for alle innspillene! Det hjalp å fikse på sql-spørringen, en LIMIT gjorde det hele mye mer overkommelig. Samtidig skulle jeg gjerne klart å slette objektene mine! Lenke til kommentar
Peter Skrevet 24. mai 2007 Del Skrevet 24. mai 2007 Da må du vise oss koden din, så skal vi si hvor(dan) du kan fjerne dem... (IKKE hele koden, bare de relevante delene, som vil si der objektene blir opprettet og lagret, og gjerne hvor du kan forkaste dem) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå