2013-03-12 13 views
7

Ho bisogno di analizzare file XML da 40 GB di dimensione, quindi normalizzarli e inserirli in un database MySQL. Quanto del file che ho bisogno di memorizzare nel database non è chiaro, né conosco la struttura XML.Analisi di file XML estremamente grandi in php

Quale parser dovrei usare e come procederesti?

+1

Per i file di grandi dimensioni, utilizzare sempre un parser di tiro come XMLReader; prova a caricare 40 GB di file in memoria per SimpleXML. –

+1

dai post correlati: http://stackoverflow.com/questions/911663/parsing-huge-xml-files-in-php?rq=1 – hexblot

+0

40 GB? Wow, ho avuto problemi con un file xml da 700 Mb su un mac os x machine. –

risposta

11

In PHP, è possibile leggere in grandi file XML estreme con la XMLReaderDocs:

$reader = new XMLReader(); 
$reader->open($xmlfile); 

estremi grandi file XML dovrebbero essere memorizzati in un formato compresso su disco. Almeno questo ha senso in quanto i file XML hanno un elevato rapporto di compressione. Ad esempio gzip come large.xml.gz.

PHP supporta che abbastanza bene con XMLReader attraverso il compression wrappersDocs:

$xmlfile = 'compress.zlib://path/to/large.xml.gz'; 

$reader = new XMLReader(); 
$reader->open($xmlfile); 

Il XMLReader permette di operare sull'elemento corrente "solo". Ciò significa che è forward-only. Se è necessario mantenere lo stato del parser, è necessario crearlo da solo.

Spesso trovo utile avvolgere i movimenti di base in un insieme di iteratori che sanno come operare su XMLReader come iterare solo attraverso elementi o elementi figlio. Questo risultato è delineato in Parse XML with PHP and XMLReader.

Vedi pure:

2

Sarebbe bello sapere cosa intendete effettivamente fare con XML. Il modo in cui viene analizzato dipende molto dall'elaborazione che è necessario eseguire, nonché dalle dimensioni.

Se si tratta di un'attività una tantum, ho iniziato in passato scoprendo la struttura XML prima di fare qualsiasi altra cosa. Il mio DTDGenerator (vedi saxon.sf.net) è stato scritto per questo scopo molto tempo fa e fa ancora il lavoro, ora ci sono altri strumenti disponibili ma non so se eseguono l'elaborazione in streaming, che è un prerequisito qui.

È possibile scrivere un'applicazione che elabora i dati utilizzando un parser in streaming pull o push (SAX o StAX). Quanto è facile dipende da quanta elaborazione devi eseguire e da quanto stato devi mantenere, cosa che non ci hai detto. In alternativa puoi provare l'elaborazione XSLT in streaming, disponibile in Saxon-EE.