lug-dd@schlittermann.de writes:
Ist lange her, ich weiß.
Wahrlich. Aber immer noch aktuell.
Was für'n Betriebssystem und was für 'ne Perlversion hast Du eigentlich?
5.8.0 auf Linux
Schonmal die letztmögliche probiert?
Das ist dann die .... äh .... www.perl.com ... 5.8.3. Hm, naj, die Maschine ist produktiv, auf der der ganze Kram läuft. da will ich nicht unbedingt jetzt das Perl upgraden. Es sind 'nen haufen selbstkompilierter Module aus dem CPAN dabei. Wenn danach irgenwas nicht mehr funzt, habe ich die Brille auf ...
Manche Versionen von Perl hatten Memory Leaks, insbesondere auch manche ActivePerl-Versionen.
Nuja, die interessieren mich weniger.
Aber mal zum Thema zurück - welches leider noch nicht gegessen ist. - Ich habe Xerces aus der Applikation verbannt. - Ich undefe alles was nicht mehr gebraucht wird an Ort und Stelle (ja, soll eigentlich nicht nötig sein ...) - Ich habe alle Objekte auf irgendwelche zirkulären Referenzen hin untersucht. Alles was verdächtig aussah, wurde geändert.
Im Schnitt hat es ein klein wenig was gebracht, pro XML werden ca. 200 KB Speicher verbraten, die nie wieder kommen. Lustigerweise sinkt der Speicherverbrauch lt 'top' zwischendurch auch mal um ein paar KB, im ganzen jedoch steigt er stetig.
Meinen DBWrapper (der letztenendlich die aus XML erzeugten Objekte in die DB klamüsert) habe ich ich schon abgeklemmt, das hat nicht geholfen. Nun habe ich den XMLHelper im Verdacht. Der macht mittlerweile mit XML::Simple statt mit Xerces aus den XMLs mein Perlobjekte. Ich habe immer eine Instanz $Shop, die ganz viel weiss. Darum muss jedes Objekt und Unterobjekt genau diesen seinen $Shop kennen. Darum gebe ich jeden Objekt einen Hinweis auf seinen $Shop mit auf den Weg. $Objekt = Tolle::Klasse->new($Shop). Alle Zugriffe auf die Shopinterna erfolgen dann nach dem Muster $self->shop->shopid() oder $self->shop->connect(). Vielleicht liegt es daran, dass hier irgendwo eine Referenz klemmt und der Speicher belegt bleibt. Die eigentlichen Artikelklassen möchte ich mal ausschliessen, die sind eher dumm.
Allerdings bringt mich eine Devel::Size auch nicht viel weiter. Mein $Artikel->Objekt, welches aus dem XML resultiert ist ca 10-15% grösser als das XML. Das ist ja OK. Irgendwo werden mir dann aber immer noch 100-150K pro Durchgang geklaut. Vielleicht erbarmt sich mal jemand und hat Lust sich den Code anzuschauen. Was lauffähiges kann ich allerdings nicht präsentieren, da die App. nur intern läuft.
Achso, als letzte Möglichkeit kommt noch Log4Perl in Frage, vielleicht knipse ich das mal aus ...
Mit freundlichen Grüßen
Jens Puruckherr