Como iterparse
itera sobre el archivo completo, se construye un árbol y no se liberan elementos. La ventaja de hacer esto es que los elementos recuerdan quién es su padre, y usted puede formar XPaths que se refieren a elementos ancestrales. La desventaja es que puede consumir mucha memoria.
Con el fin de liberar memoria a medida que analizar sintácticamente, el uso de 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
que luego se podría utilizar como esto:
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)
le recomiendo the article en que el anterior fast_iter
Es basado; debería ser especialmente interesante para usted si está tratando con grandes archivos XML.
La fast_iter
presentada anteriormente es una versión ligeramente modificada de la que se muestra en el artículo. Este es más agresivo sobre la eliminación de antepasados anteriores, por lo tanto, ahorra más memoria. Here you'll find a script que demuestra la diferencia .
Gracias! Tanto su solución como la que acabo de agregar parecen ser el truco. Tengo curiosidad por saber cuál es la mejor solución para usted y para los demás. ¿Que piensas? –
Resulta que su solución funciona y la solución http://effbot.org/zone/element-iterparse.htm no lo hizo (aún me quedaba toda la memoria) –
¡Gracias! Esta es la versión que realmente funciona. Las versiones de Liza Daly, effbot y lxml documentos oficiales NO me ahorraron mucha memoria. – fjsj