Re: Effizient ueber große Mengen von Objekten iterieren
Michael Hierweck <[email protected]>
| Newsgroups | gmane.comp.web.zope.german |
|---|---|
| Message-ID | <[email protected]> |
Hallo Andreas, Andreas Jung wrote: > Am 20.11.09 10:22, schrieb Michael Hierweck: >> Hallo allerseits, >> >> kann man in Plone 3.3.x effizienter über viele Objekte iterieren, als so: >> >> >> brains = catalog.searchResults([...]) >> for brain in brains: >> object = brain.getObject() >> [...] >> > > Vielleicht hilft ein abschliessendes > > object._p_deactivate() Eigentlich sollte das nicht nötig sein, oder? Mal kurz das Fazit des heutigen Tages: Ich wundere mich gerade ein wenig, es scheint aber so, aus würden meine geladenen Objekt in der Tat nicht (vollständig) von der Garbage Collection entfernt. Ich kann nämlich den Cache für die ZODB Connections (ich habe zwei eine für / und eine für den Catalog) minimieren. Dann wird es langsamer (klar), aber der RAM-Bedarf ändert sich kaum. Vollaufende Caches möchte daher eigentlich ausschließen. Bemerkenswert finde ich aber: Wenn ich alle 1.000 Objekte transaction.abort() aufrufe, liegt der RAM-Bedarf nur noch bei ca. 40%. Ich interpretiere das so, dass meine Leseoperationen offenbar irgendwie im Bereich Transaktionsmanagement RAM kosten, und zwar etwa 1 GB bei 100.000 iterierten Content-Objekten. (Die relatedItems sind ca. 0-2 pro Objekt aus 5.000 möglichen Zielobjekten.) Rechnerisch sind das also rund 10KB "geleakter Memory" pro angesprochenem Content-Objekt. Die Leseoperationen sind aber wirklich nur Aufrufe simpler "Getter" von ATFields bzw. das Verfolgen von relatedItems und das Aufrufen von "Getter" der Zielobjekte. Der Output wird dann direkt rausgeschrieben (stdout, CSV-File oder SQL-DB macht keinen Unterschied). Beste Grüße Michael _______________________________________________ zope mailing list [email protected] https://mail.dzug.org/mailman/listinfo/zope