Gå til innhold

Hvordan bør jeg frigjøre minne?


Anbefalte innlegg

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
Videoannonse
Annonse

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
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
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

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

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().""

 

 ?>

gir
For 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 :shrug:

Endret av Ernie
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...