2011-09-07 29 views
5

Ho il codice Python per analizzare un file XML come detailed here. Comprendo che i file XML sono noti per il hogging delle risorse di sistema quando vengono manipolati in memoria. La mia soluzione funziona con file XML più piccoli (ad esempio 200 KB e un file 340 MB).Come dividere un file XML in modo semplice in Python?

Ho iniziato a ricercare l'implementazione di StAX (pull parser), ma sono in esecuzione con un programma serrato e sto cercando un approccio molto più semplice per questo compito.

Capisco la creazione di blocchi di file più piccoli, ma come faccio a estrarre gli elementi giusti emettendo i tag main/header ogni volta?

Per esempio, questo è lo schema:

<?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> 

Come si crea nuovi file XML con i dati di intestazione per ogni 1000 Elementi del libro? Per un esempio concreto del codice e del set di dati, fare riferimento al mio altro question here. Molte grazie.

Tutto quello che voglio fare è evitare il caricamento in-memory del set di dati tutto in una volta. Possiamo analizzare il file XML in streaming? Sto pensando lungo le linee giuste?

p.s: La mia situazione è simile a un question asked nel 2009. Pubblicheremo una risposta qui una volta trovata una soluzione più semplice per il mio problema. Il tuo feedback è apprezzato.

risposta

8

È possibile 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

È possibile utilizzare elementtree.iterparse e scartare ogni tag del libro dopo l'elaborazione.

+1

Meglio ancora, eTree uso di lxml (http://lxml.de/tutorial.html) per un incremento delle prestazioni. – six8

+1

@Cixate: non è chiaro (senza un benchmark) se 'cElementTree.iterparse()' è più lento di 'lxml.etree.iterparse()' quando è richiesta solo l'analisi http://www.ibm.com/developerworks/xml/library/x-hiperfparse / – jfs

Problemi correlati