Da iterparse
über die gesamte Datei iteriert, wird ein Baum erstellt und keine Elemente werden freigegeben. Der Vorteil dabei ist, dass die Elemente sich daran erinnern, wer ihr Elternteil ist, und Sie können XPaths bilden, die sich auf Vorfahrelemente beziehen. Der Nachteil ist, dass es viel Speicher verbrauchen kann.
Um etwas Speicher zu frei wie Sie analysieren, verwenden Liza Daly fast_iter
:
def fast_iter(context, func, *args, **kwargs):
"""
http://lxml.de/parsing.html#modifying-the-tree
Based on Liza Daly's fast_iter
http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
See also http://effbot.org/zone/element-iterparse.htm
"""
for event, elem in context:
func(elem, *args, **kwargs)
# It's safe to call clear() here because no descendants will be
# accessed
elem.clear()
# Also eliminate now-empty references from the root node to elem
for ancestor in elem.xpath('ancestor-or-self::*'):
while ancestor.getprevious() is not None:
del ancestor.getparent()[0]
del context
, die Sie dann wie folgt verwenden:
def process_element(elem):
print "why does this consume all my memory?"
context = lxml.etree.iterparse('really-big-file.xml', tag='schedule', events = ('end',))
fast_iter(context, process_element)
I the article, auf dem die oben fast_iter
empfehlen basiert; Es sollte für Sie besonders interessant sein, wenn Sie mit großen XML-Dateien arbeiten.
Die oben dargestellte ist eine leicht modifizierte Version der im Artikel gezeigten . Dieser ist aggressiver beim Löschen von vorherigen Vorfahren, spart somit mehr Speicher. Here you'll find a script, die den Unterschied zeigt.
Dank! Sowohl Ihre Lösung als auch die, die ich gerade hinzugefügt habe, scheinen den Trick zu machen, ich bin neugierig, welche Sie und andere Leute fühlen, ist eine bessere Lösung. Hast du irgendwelche Gedanken? –
Stellt sich heraus, dass Ihre Lösung funktioniert und die http://effbot.org/zone/element-iterparse.htm Lösung nicht (es hat immer noch meinen gesamten Speicher aufgefressen) –
Danke! Dies ist die Version, die wirklich funktioniert. Versionen von Liza Daly, effbot und offiziellen Lxml-Dokumenten haben mir NICHT viel Speicher gespart. – fjsj