2011-09-07 71 views
5

Tengo el código de Python para analizar un archivo XML como detailed here. Entiendo que los archivos XML son conocidos por acaparar recursos del sistema cuando se manipulan en la memoria. Mi solución funciona para archivos XML más pequeños (digamos 200 KB y tengo un archivo de 340 MB).¿Cómo dividir un archivo XML de la manera más simple en Python?

Comencé a investigar la implementación de StAX (pull parser) pero estoy trabajando con un calendario apretado y estoy buscando un enfoque mucho más simple para esta tarea.

Entiendo la creación de trozos de archivos más pequeños, pero ¿cómo puedo extraer los elementos correctos imprimiendo siempre las etiquetas principales/de encabezado?

Por ejemplo, este es el esquema:

<?xml version="1.0" ?> 
<!--Sample XML Document--> 
<bookstore> 
    <book Id="1"> 
     .... 
     .... 
    </book> 
    <book Id="2"> 
     .... 
     .... 
    </book> 
    <book Id="3"> 
     .... 
     .... 
    </book> 
    .... 
    .... 
    .... 
    <book Id="n"> 
     .... 
     .... 
    </book> 
</bookstore> 

¿Cómo puedo crear nuevos archivos XML con datos de cabecera por cada 1000 elementos del libro? Para obtener un ejemplo concreto del código y conjunto de datos, consulte mi otro question here. Muchas gracias.

Todo lo que quiero hacer es evitar la carga en memoria del conjunto de datos, todo a la vez. ¿Podemos analizar el archivo XML de forma continua? ¿Estoy pensando en las líneas correctas?

p.s: Mi situación es similar a la de question asked en 2009. Publicaré una respuesta aquí una vez que encuentre una solución más simple para mi problema. Su opinión es apreciada.

Respuesta

8

Puede parse your big XML file incrementally:

from xml.etree.cElementTree import iterparse 

# get an iterable and turn it into an iterator 
context = iter(iterparse("path/to/big.xml", events=("start", "end"))) 

# get the root element 
event, root = next(context) 
assert event == "start" 

for event, elem in context: 
    if event == "end" and elem.tag == "book": 
     # ... process book elements ... 
     root.clear() 
2

Puede usar elementtree.iterparse y descartar cada etiqueta de libro una vez procesada.

+1

Mejor aún, el uso de etree lxml (http://lxml.de/tutorial.html) para un aumento de rendimiento. – six8

+1

@Cixate: no está claro (sin un punto de referencia) si 'cElementTree.iterparse()' es más lento que 'lxml.etree.iterparse()' cuando solo se requiere análisis http://www.ibm.com/developerworks/xml/library/x-hiperfparse / – jfs

Cuestiones relacionadas