Python se está quedando sin memoria analizando XML usando cElementTree.iterparse

Una versión simplificada de mi función de análisis XML está aquí:

import xml.etree.cElementTree as ET def analyze(xml): it = ET.iterparse(file(xml)) count = 0 for (ev, el) in it: count += 1 print('count: {0}'.format(count)) 

Esto hace que Python se quede sin memoria, lo que no tiene mucho sentido. Lo único que realmente estoy almacenando es el conteo, un entero. ¿Por qué está haciendo esto?

introduzca la descripción de la imagen aquí

¿Ves esa caída repentina en la memoria y el uso de la CPU al final? Eso es Python estrellándose espectacularmente. Al menos me da un MemoryError (dependiendo de lo que esté haciendo en el bucle, me da más errores aleatorios, como un IndexError ) y una traza de stack en lugar de un error de seguridad. Pero ¿por qué se está estrellando?

    La documentación le dice que “analiza una sección XML en un árbol de elementos [mi énfasis] de manera incremental”, pero no cubre cómo evitar la retención de elementos no interesantes (que pueden ser todos). Eso está cubierto por este artículo por el effbot .

    Recomiendo encarecidamente que cualquiera que use .iterparse() lea este artículo de Liza Daly . Cubre tanto lxml como [c] ElementTree.

    Cobertura previa en SO:

    Usando Python Iterparse para grandes archivos XML
    ¿Puede Python xml ElementTree analizar un archivo xml muy grande?
    ¿Cuál es la forma más rápida de analizar documentos XML grandes en Python?

    Ejemplo de código:

     import xml.etree.cElementTree as etree def getelements(filename_or_file, tag): context = iter(etree.iterparse(filename_or_file, events=('start', 'end'))) _, root = next(context) # get root element for event, elem in context: if event == 'end' and elem.tag == tag: yield elem root.clear() # preserve memory