Ik maak in een programma veel gebruik van for en foreach constructies. Nu is er een samenloop van omstandigheden waardoor ik heel veel gegevens op moet halen en op de server van een klant tegen de geheugenlimiet aan loop. Dus er van uitgaande dat ik inefficient heb geprogrammeerd, of minstens kan verbeteren, heb ik uitgezocht waar ik geheugen verlies. Dit blijkt voornamelijk in de for/foreach lussen te zijn. Om te testen waar het fout gaat heb ik de volgende code gemaakt:
Nu gaat het hier nog niet om schokkende hoeveelheden. Maar zodra ik wat meer doe binnen de lussen en dit een aantal keer tegen kom in verschillende functies, dan blijft er meer geheugen over.
Mijn vraag is eigenlijk of ik iets verkeerds doe, of juist iets niet. Dit verlies is permanent gedurende de hele uitvoering, het komt ook voor als ik een functie aan roep die daarna resultaat terug geeft.
Ik heb uitgezocht hoe php met het geheugen om gaat, en geheugen dat niet meer gebruikt is (refcount=0) zou automatisch vrij gegeven worden. Aan het einde van mijn voorbeeldscript is er geen variabele meer over die gebruikt kan worden, dus het geheugenverbruik zou moeten zijn wat die was aan het begin van het script;
bovendien; als ik $real_usage (eerste parameter memory_get_usage) op true zet is het verschil groter:
Weet iemand meer van dit onderwerp?
PHP:
De output is:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <?php echo "1) start:\t" . memory_get_usage() . "\n"; $items = array(); for($i = 0; $i < 999; ++$i) { $items[$i]['val1'] = str_repeat('*', 9999); $items[$i]['val2'] = str_repeat('*', 9999); $items[$i]['val3'] = str_repeat('*', 9999); } echo "2) items:\t" . memory_get_usage() . "\n"; unset($i, $items); echo "3) unset:\t" . memory_get_usage() . "\n"; ?> |
code:
1
2
3
| 1) start: 62968 2) items: 30437256 3) unset: 127624 |
Nu gaat het hier nog niet om schokkende hoeveelheden. Maar zodra ik wat meer doe binnen de lussen en dit een aantal keer tegen kom in verschillende functies, dan blijft er meer geheugen over.
Mijn vraag is eigenlijk of ik iets verkeerds doe, of juist iets niet. Dit verlies is permanent gedurende de hele uitvoering, het komt ook voor als ik een functie aan roep die daarna resultaat terug geeft.
Ik heb uitgezocht hoe php met het geheugen om gaat, en geheugen dat niet meer gebruikt is (refcount=0) zou automatisch vrij gegeven worden. Aan het einde van mijn voorbeeldscript is er geen variabele meer over die gebruikt kan worden, dus het geheugenverbruik zou moeten zijn wat die was aan het begin van het script;
bovendien; als ik $real_usage (eerste parameter memory_get_usage) op true zet is het verschil groter:
code:
Maar ik denk niet dat ik me over deze laatste cijfers druk hoef te maken...1
2
3
| 1) start: 262144 2) items: 30670848 3) unset: 6815744 |
Weet iemand meer van dit onderwerp?