Speicherverbrauch für große Komposition verringern.
Hallo liebe dclpm Leser,
ich erzeuge aus einem NestetSet (Das ist eine Baumstruktur) eine etwas
größere Komposition.
Diese Komposition nimmt pro Node 4 Objekte auf.
Leider verabschiedet sich das Script bei nur 1000 Nodes mit
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to
allocate 5295 bytes) in core.php on line 361
kann ja wohl nicht sein denk ich. Schnell mal überschlagen eigentlich
nur Integer-werte, und 2 kurze Strings pro Node.
Speicherverbrauch in der DB währe ca. 160 Byte.
Dann teste ich halt mal mit einem Objekt aus dem ORM:
$tests=array();
$vount=3000;
$x=memory_get_usage();
for($i=0;$i<$vount;$i++){
$xx=new Map();
$xx->setLe(1);
$tests[]=$xx;
}
$y=memory_get_usage();
$z=$y-$x;
echo "mem:" . $z . "=" .$z / $vount ."<br>";
Ausgabe:
mem:11131336=3710,44533333
WTF! ca. 3710 Byte pro Objekt?
Testweise habe ich dann eine selten genutzte Eigenschaft, die sowieso
mit null initialisiert wird deaktiviert:
//protected $dateModifier = null;
mem:10819160=3606,38666667
Aha. Hundert Byte weniger für eine Nullreferenz.
Hab jetzt versucht die Daten in einem Array zu halten statt in
Member-Variablen -> Auch nicht besser.
Weiß jemand wie man den Speicherhunger von PHP einigermaßen in den Griff
bekommt?
Danke,
Harald.
P.S. um etwaigen Flames vorzugreifen: den Kompletten Baum lese ich nur
zu Synchonisationszwecken aus. Ich zeige die 1000 Datensätze nirgens an.
Re: Speicherverbrauch für große Komposition verringern.
Harald Stowasser schrieb:
> Weiß jemand wie man den Speicherhunger von PHP einigermaßen in den Griff
> bekommt?
Ich hab zwar keine Ahnung, wie man entsprechend optimieren könnte,
allerdings möchte ich auf 'xdebug' hinweisen, was neben Debugging und
Profiling auch die Speicherbedarfsanalyse mit diversen Funktionen
vereinfacht. Genannt seien hier folgende, die aber erst ab PHP 5.2.1
standardmäßig zur Verfügung stehen:
xdebug_memory_usage( )
Returns the current memory usage
xdebug_peak_memory_usage( )
Returns the peak memory usage
ciao
ulf
Re: Speicherverbrauch für große Komposition verringern.
Ulf Seltmann schrieb:
> Harald Stowasser schrieb:
>> Weiß jemand wie man den Speicherhunger von PHP einigermaßen in den Griff
>> bekommt?
> Ich hab zwar keine Ahnung, wie man entsprechend optimieren könnte,
> allerdings möchte ich auf 'xdebug' hinweisen, was neben Debugging und
> Profiling auch die Speicherbedarfsanalyse mit diversen Funktionen
> vereinfacht. Genannt seien hier folgende, die aber erst ab PHP 5.2.1
> standardmäßig zur Verfügung stehen:
Nein, die Funktionen stehen nicht standardmäßig zur Verfügung, sondern
nur wenn du die xdebug-Erweiterung installiert hast. Geändert hat sich
hier, dass man PHP ab 5.2.1 nicht mehr mit --enable-memory-limit bauen
muss, um die Funktion zu nutzen.
> xdebug_memory_usage( )
> Returns the current memory usage
> xdebug_peak_memory_usage( )
> Returns the peak memory usage
Die beiden Funktionen waren schon immer Teil des xdebug-Packages. Die
Funktionen memory_get_usage() und memory_get_peak_usage(), die Harald
übrigens auch verwendet hat, sind seit PHP 4.3.2 verfügbar, aber eben
auch erst ab PHP 5.2.1 ohne --enable-memory-limit.