¿Cuál es la forma más eficiente de extraer información de una gran cantidad de archivos xml en python?

StackOverflow https://stackoverflow.com/questions/344559

Pregunta

Tengo un directorio lleno (~ 10 3 , 10 4 ) de archivos XML del cual necesito extraer el contenido de varios campos. He probado diferentes analizadores xml, y dado que no necesito validar el contenido (costoso) estaba pensando simplemente en usar xml.parsers.expat (el más rápido) para revisar los archivos, uno por uno para extraer el datos.

  1. ¿Hay una manera más eficiente? (la coincidencia de texto simple no funciona)
  2. ¿Necesito emitir un nuevo ParserCreate () para cada nuevo archivo (o cadena) o puedo reutilizar el mismo para cada archivo?
  3. ¿Alguna advertencia?

¡Gracias!

¿Fue útil?

Solución

La forma más rápida sería unir cadenas (con, por ejemplo, expresiones regulares) en lugar de analizar XML, dependiendo de tus XML esto podría funcionar.

Pero lo más importante es esto: en lugar de pensar en varias opciones, simplemente impleméntelas y cronometralas en un conjunto pequeño. Esto tomará aproximadamente la misma cantidad de tiempo y le dará números reales que lo llevarán hacia adelante.

EDITAR:

  • ¿Están los archivos en una unidad local o unidad de red? La E / S de red te matará aquí.
  • El problema se paraleliza trivialmente: puede dividir el trabajo entre varias computadoras (o varios procesos en una computadora multinúcleo).

Otros consejos

Por lo general, sugeriría utilizar iterparse de ElementTree , o para velocidad extra, su contraparte de lxml . También intente utilizar Procesando (viene incorporado con 2.6) para paralelizar.

Lo importante de iterparse es que obtienes las estructuras (sub) del elemento a medida que se analizan.

import xml.etree.cElementTree as ET
xml_it = ET.iterparse("some.xml")
event, elem = xml_it.next()

event siempre será la cadena " end " en este caso, pero también puede inicializar el analizador para informarle sobre nuevos elementos a medida que se analizan. No tiene ninguna garantía de que todos los elementos secundarios se hayan analizado en ese punto, pero los atributos están ahí, si solo está interesado en eso.

Otro punto es que puede dejar de leer elementos del iterador antes, es decir, antes de que se haya procesado todo el documento.

Si los archivos son grandes (¿lo son?), existe un modismo común para mantener constante el uso de la memoria como en un analizador de transmisión.

Si sabe que los archivos XML se generan utilizando el mismo algoritmo, podría ser más eficiente no realizar ningún análisis XML. P.ej. si sabe que los datos están en las líneas 3, 4 y 5, puede leer el archivo línea por línea y luego usar expresiones regulares.

Por supuesto, ese enfoque fallaría si los archivos no son generados por la máquina, o se originan de diferentes generadores, o si el generador cambia con el tiempo. Sin embargo, soy optimista de que sería más eficiente.

Si reciclas o no los objetos del analizador es irrelevante. Se crearán muchos más objetos, por lo que un solo objeto analizador realmente no cuenta mucho.

Una cosa que no indicó es si está leyendo o no el XML en un DOM de algún tipo. Supongo que probablemente no, pero en el caso de que lo sea, no lo hagas. Utilice xml.sax en su lugar. El uso de SAX en lugar de DOM le dará un aumento significativo en el rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top