Accesso casuale a file XML di grandi dimensioni
-
29-10-2019 - |
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.
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: VTD-XML)
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.