Ich beginne an meinem Verstand zu zweifeln.
Aber erstmal ... die Spekulation über meinen Job ist genau so Zielführend wie die Diskussion ob ihr eure Frauen befriedigen könnt. Deshalb schlage ich vor, die Diskussion wieder auf das Thema zu lenken auch wenn beide Themengebiete äußert interessant wären ;).
Klar könnte man alles so umbauen, dass es in einer anderen Programmiersprache oder in der Console läuft. Zum einen fehlt mir dazu die Lust zum anderen die Zeit. Leider muss ich sagen, dass ein anfängliches Projekt ausgeufert ist. Dass kennt ihr bestimmt ... ein paar Funktionen (soll ja schnell sein,d a braucht es kein OOP) hier und da ein paar echos. Dann stellt man fest das reicht nicht, also baut man die Funktionen in Objekte um und so weiter ...
Ich habe mich seit gestern sehr intensiv mit der Speicherthematik auseinander gesetzt und Verzweifel da wirklich...
Zu erst habe ich meine Objekte so umgebaut, dass die rechen und speicherintensive Objekte nicht mehr für die Ausgabe zuständig sind. Das war auch ein klarer Design-Fehler. So konnte ich die Speicherlast pro Berechnung von 13MB auf 6MB runter bekommen. Jedoch erscheinen mir 6MB immer noch als sehr viel. Als ich dann im Produktumfeld nicht weiter gekommen bin habe ich eine kleine Testseite aufgesetzt und etwas rumgespielt. Vor allem beschäftigt mich die Frage wie ich den Speicher richtig frei gebe. Wie ich leider lesen musste reicht ein unset wohl nicht aus.
Ich habe folgenden Code:
$arArray = [];
for( $iLoop = 0; $iLoop <= 1000000; $iLoop++)
{
$arArray[ $iLoop ] = md5( $iLoop );
$arArray[ $iLoop ] = null;
unset( $arArray[ $iLoop ] );
}
Vor und hinter dem Code speichere ich bzw. frage ich den Speicher ab. Das obige Beispiel bringt eine Speicherbelegung von 0,0008 MB.
for( $iLoop = 0; $iLoop <= 1000000; $iLoop++)
{
$arArray[] = md5( $iLoop );
$arArray[ count( $arArray ) - 1 ] = null;
unset( $arArray[ count( $arArray ) - 1 ] );
}
Dieses Beispiel braucht ca. 35 MB Speicherplatz. Untersucht man das Array genauer, so stellt man fest, dass die Array Keys bestehen bleiben. Meiner Meinung nach ist es aber die gleiche Methodik.
Auf jeden Fall bringt mich das zu der Erkenntnis, dass ich keine Ahnung habe, wann und wie PHP den Speicher freigibt. Und wenn ich das im kleinen Testscript schon nicht verstehe, wie sollte ich es dann bei den komplexen Berechnungen verstehen?
Noch ein Beispiel gefällig?
for( $iLoop = 0; $iLoop <= 100000; $iLoop++)
{
$arArray[ $iLoop ] = md5( $iLoop );
}
Braucht ca. 13 MB
class cTestObjekt
{
private $strMd5 = "";
public function setMd5( $strMd5 )
{
$this->strMd5 = $strMd5;
}
}
for( $iLoop = 0; $iLoop <= 100000; $iLoop++)
{
$arArray[ $iLoop ] = md5( $iLoop );
}
Braucht ca. 6MB
Wieso das Speichern in einem Objekt weniger Speicherplatz benötigt ist mir ein Rätsel. Ich weiß zwar nicht wie genau ein Objekt in PHP intern erzeugt oder gespeichert wird, hätte aber Overhead Daten vermutet, die den kompletten Speicherbedarf erhöhen.
So oder so ... wie gesagt konnte ich einiges an Speicherplatzt einsparen, aber noch nicht genug. Deshalb werde ich wohl zu einem Workaround greifen und Javascript einsetzen.
Gruß Speicherverschwender T-Rex