2010-09-14 24 views

Respuesta

5

La mayoría de las bibliotecas de DOM, como ElementTree, compilan todo el Modelo de documento en el núcleo. Tradicionalmente, cuando su modelo es demasiado grande para caber en la memoria a la vez, necesita usar un analizador más orientado a flujo como xml.sax.

Esto a menudo es más difícil de lo que cabría esperar, especialmente cuando se usa para operaciones de orden superior, como tratar todo el DOM a la vez.

¿Es posible que el documento XML es bastante simple como

<entries> 
    <entry>...</entry> 
    <entry>...</entry> 
</entries> 

que permitirá trabajar en subconjuntos de los datos de una manera más amigable elementtree?

+0

muchas gracias. – zhangwf

2

La única API que he visto que se puede manejar este tipo de cosas es en absoluto pulldom:

http://docs.python.org/library/xml.dom.pulldom.html

Pulldom utiliza el API SAX para construir nodos DOM parciales; tirando de subárboles específicos como un grupo y luego descartándolos cuando hayas terminado, puedes obtener la eficacia de la memoria de SAX con la cordura del uso de DOM.

Es una API incompleta; cuando lo usé tuve que modificarlo para que sea completamente utilizable, pero funciona como una base. Ya no lo uso, así que no recuerdo lo que tuve que agregar; solo una advertencia anticipada.

Es muy lento.

XML es un formato muy pobre para manejar grandes conjuntos de datos. Si tiene algún control sobre los datos de origen y si tiene sentido para el conjunto de datos, es mejor separar los datos en trozos más pequeños que pueda analizar completamente en la memoria.

La otra opción es usar SAX APIs, pero son un dolor serio para hacer algo no trivial directamente.

11

Echa un vistazo a la función iterparse(). Puede encontrar una descripción de cómo puede usarlo para analizar documentos muy grandes here.

+0

La función iterparse() resolverá su problema, recientemente analicé fácilmente un documento de 1GB xml con la ayuda de iterparse :) –

Cuestiones relacionadas