Estoy tratando de analizar un archivo grande (> 2GB) de datos estructurados de marcado y la memoria no es suficiente para esto. Cuál es la forma óptima de clase de análisis XML para esta condición. Más detalles, por favor.¿Puede Python xml ElementTree analizar un archivo xml muy grande?
Respuesta
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?
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.
Echa un vistazo a la función iterparse()
. Puede encontrar una descripción de cómo puede usarlo para analizar documentos muy grandes here.
La función iterparse() resolverá su problema, recientemente analicé fácilmente un documento de 1GB xml con la ayuda de iterparse :) –
- 1. Cómo mantener los comentarios al analizar XML usando Python/elementtree
- 2. Compatibilidad con Python ElementTree para analizar entidades XML desconocidas
- 3. Trabajando con un archivo XML muy grande en C#
- 4. RE: archivo XML grande
- 5. ¿Cómo extraer atributos XML usando Python elementtree
- 6. análisis de un archivo xml grande con Python - etree.parse error
- 7. Haskell analizar el archivo xml grande con poca memoria
- 8. análisis XML - elementtree vs SAX y DOM
- 9. Consultas aleatorias en un archivo xml grande
- 10. Python: cortar un archivo binario muy grande
- 11. analizar un archivo XML en Qt
- 12. Oracle: cargando un archivo xml grande
- 13. División de un archivo XML grande en Python
- 14. Guardar archivos XML usando ElementTree
- 15. Analizando XML en Python usando el ejemplo de ElementTree
- 16. División XML de un archivo grande
- 17. Python xml ElementTree de una fuente de cadena?
- 18. xml.parsers.expat.ExpatError al analizar XML
- 19. Python y ElementTree: return "inner XML" excluyendo elemento padre
- 20. Cómo analizar el archivo XML en RapidXML
- 21. ¿Generar archivos XML muy grandes en Python?
- 22. ¿Cómo puedo convertir un archivo xml en JSON usando Python?
- 23. ¿Qué significa analizar XML?
- 24. Cómo actualizar el archivo XML grande
- 25. Perl, cómo analizar el archivo XML, xpath
- 26. Analizar archivo XML local en Android
- 27. ¿Cómo escribir XML (grande) en un archivo en C#?
- 28. cómo pasar un archivo xml a lxml para analizar?
- 29. HTTP Descargar archivo muy grande
- 30. Validar un archivo XML ENORME
muchas gracias. – zhangwf