Domanda

Ho un set di strumenti che indicizzano un file XML di grandi dimensioni (file di dump di mediawiki) e utilizzo quelle indece per l'accesso casuale ai singoli record memorizzati nel file. Funziona molto bene ma sto "analizzando" l'XML con funzioni di stringa e/o espressioni regolari piuttosto che un vero parser XML che è una soluzione fragile se il modo in cui i file vengono creati vengono modificati in futuro.

Alcuni o la maggior parte dei parser XML hanno il modo di fare queste cose?

(Ho le versioni dei miei strumenti scritti in C, Perl e Python. Analizzare gli interi file in una sorta di database o mapparli in memoria non sono opzioni.)

AGGIORNARE

Ecco statistiche approssimative per il confronto: i file che sto usando sono per lo più pubblicati ogni settimana circa, la dimensione di quella attuale è di 1.918.212.991 byte. La versione C del mio strumento di indicizzazione richiede alcuni minuti sul mio netbook e deve essere eseguita solo una volta per ogni nuovo file XML pubblicato. Meno spesso uso gli stessi strumenti su un altro file XML la cui dimensione corrente è di 30.565.654.976 byte ed è stato aggiornato solo 8 volte nel 2010.

È stato utile?

Soluzione 3

VTD-XML Sembra essere il primo serio tentativo di affrontare questo problema:

Il Il più efficiente in termini di memoria del mondo (1.3x ~ 1,5x la dimensione di un documento XML) Parser XML ad accesso casuale.

(VTD-XML ha anche il suo tag qui su StackOverflow in modo da poter seguire le missioni, ecc: )

Altri suggerimenti

Penso che dovresti archiviare questi dati in un database XML come Exist-DB, piuttosto che creare i tuoi strumenti per fare un sottoinsieme molto piccolo di ciò che ti dà un database XML.

Se stai usando Python, prova LXML - è molto Veloce e flessibile e si confronterà abbastanza bene con i regex per la velocità. Molto più veloce delle alternative, in qualsiasi lingua - senza compromesso.

Usa iTerparse per passare attraverso gli articoli di Wikipedia.

Tieni presente che questo non dà il tuo accesso casuale agli articoli nella tua dump (che è una richiesta perfettamente ragionevole!) - ma IterParse ti darà un cursore "in avanti" e facile da usare? E LXML potrebbe essere il Strumento giusto da utilizzare per analizzare i pezzi da fare con altri mezzi.

Ecco la migliore documentazione che ho trovato per questo:

http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html

(Prova la versione PDF)

Ora fa parte della distribuzione standard di Python.

XML è un formato strutturato. Come tale a caso L'accesso non ha davvero molto senso: devi sapere dove stai andando.

L'espressione regolare richiede anche che l'intera stringa venga caricata in memoria. Questo è ancora meglio di DOM poiché DOM di solito richiede 3-4 volte più memoria della dimensione del file XML.

La soluzione tipica per questi casi è Sax dove questi hanno davvero un Piccola stampa del piede di memoria Ma sono come un cursore solo in avanti: quindi non si accede in modo casuale, devi attraversare l'albero per arrivare dove hai bisogno. Se stai usando .NET, puoi usare XmlTextReader.

Gli indici sono utili anche se l'XML non si aggiorna spesso poiché la creazione di tali indici può essere costosa.

XPath è di gran lunga migliore di "Analisi" di stringa/regex, ma XPath funziona con i documenti XML che vengono analizzati nella memoria DOM prima, se i tuoi documenti sono davvero grandi, potresti avere problemi di memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top