Das Lesen von Großen XML-Datei mit StAX und XPath
In der input-Datei enthält Tausende von Transaktionen in XML-format, welches rund 10 GB Größe. Die Voraussetzung ist, wählen Sie jede Transaktion, die XML-basiert auf der Eingabe des Benutzers und senden Sie es an die Verarbeitung system.
Den Beispiel-Inhalt der Datei
<transactions>
<txn id="1">
<name> product 1</name>
<price>29.99</price>
</txn>
<txn id="2">
<name> product 2</name>
<price>59.59</price>
</txn>
</transactions>
Den (technischen)Benutzer wird voraussichtlich die Eingabe tag-name wie <txn>
.
Möchten wir zu dieser Lösung werden mehr Generika. Der Inhalt der Datei kann unterschiedlich sein, und die Benutzer können geben Sie einen XPath-Ausdruck wie "//transactions/txn
" zu Holen einzelne Transaktionen.
Es gibt einige technische Dinge, die wir haben, zu prüfen, hier
- Können Sie die Datei in einem freigegebenen Speicherort oder FTP -
- Da die Größe der Datei ist riesig, wir können nicht laden Sie die gesamte Datei JVM
Können wir den StAX-parser für dieses Szenario? Hat es sich um XPath-Ausdruck als Eingabe und wählen/wählen Sie die Transaktion XML.
Auf der Suche nach Anregungen. Vielen Dank im Voraus.
- Meine Empfehlung ist, nutzen Sie die erweiterte vtd-xml in der mem-Karte-Modus und 64-bit-jvm
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stax und xpath sind sehr verschiedene Dinge. Stax ermöglicht es Ihnen, zu analysieren, eine streaming-XML-Dokument in eine vorwärts-Richtung. Xpath ermöglicht die Analyse in beide Richtungen. Stax ist eine sehr schnelle streaming-XML-parser, aber, wenn Sie wollen, xpath, java hat eine eigene Bibliothek für das.
Werfen Sie einen Blick auf diese Frage für eine sehr ähnliche Diskussion: Gibt es eine XPath-Prozessor für SAX-Modell?
Wenn die Leistung ist ein wichtiger Faktor, und/oder das Dokument groß ist (beides scheint hier der Fall sein), ist der Unterschied zwischen Ereignis-parser (wie SAX oder StAX) und die native Java XPath-Implementierung ist, dass letztere baut eine W3C-DOM-Dokument vor der Auswertung des XPath-Ausdrucks. [Es ist interessant zu beachten Sie, dass alle Java Document Object Model Implementierungen wie der DOM oder Axiom verwenden einen Ereignis-Prozessor (wie SAX oder StAX) zu bauen, die in-memory-Repräsentation, also, wenn Sie jemals nur mit dem event-Prozessor-Sie sparen Speicher und die Zeit, die es braucht, um zu bauen einen DOM.]
Als ich erwähnte, die XPath-Implementierung im JDK arbeitet auf eine W3C-DOM-Dokument. Sie können dies in den Java-JDK-source-code-Umsetzung durch die Betrachtung
com.sun.org.apache.xpath.internal.jaxp.XPathImpl
, in denen vor der evaluate () - Methode aufgerufen wird, wird der parser muss zuerst analysieren Sie die Quelle:Nachdem diese Ihre 10 GB XML wird dargestellt im Speicher (plus was auch immer overhead) — wahrscheinlich nicht das, was Sie wollen. Während möchten Sie vielleicht einen eher "generischen" Lösung, die sowohl Ihrem Beispiel XPath-und XML-markup-scheint relativ einfach, so scheint es nicht zu sein eine wirklich starke Begründung für ein XPath (außer vielleicht Programmierung Eleganz). Das gleiche gilt auch für die XProc Vorschlag: diese würden auch eine DOM. Wenn Sie wirklich brauchen, eine DOM-Sie könnte verwenden Axiom eher als das W3C-DOM. Axiom hat eine viel freundlichere API und baut den DOM über StAX, so es ist schnell, und Jaxen verwendet für seine XPath-Implementierung. Jaxen erfordert einige Art von DOM (W3C-DOM, DOM4J oder JDOM). Dies gilt von allen XPath-Implementationen, also, wenn Sie nicht wirklich brauchen, XPath kleben mit nur die Ereignisse parser empfohlen werden würde.
SAX ist der alte streaming-API mit StAX neuere, und viel schneller. Entweder über das native JDK StAX-Implementierung (
javax.xml.stream
) oder die Woodstox StAX-Implementierung (das ist deutlich schneller, nach meiner Erfahrung), würde ich empfehlen, eine XML-ereignisfilter, dass die ersten Spiele auf element-Typ-Namen (zum erfassen von<txn>
Elemente). Dies erzeugt kleine Ausbrüche von Veranstaltungen (element, Attribut, text), die überprüft werden können, für die entsprechenden Benutzer Werte. Auf eine gute Partie, Sie können entweder ziehen Sie die notwendigen Informationen über die Veranstaltungen oder pipe der bounded events zu bauen ein mini-DOM aus, wenn Sie Sie gefunden, das Ergebnis war einfacher zu navigieren. Aber es klingt wie das wäre des guten zuviel, wenn das markup ist einfach.Wäre dies wahrscheinlich die einfachste, Schnellste Ansatz und vermeiden Sie die Speicher-overhead der Aufbau eines DOM. Wenn Sie übergeben werden die Namen der Elemente und attribute für den filter (also, dass Sie Ihre matching-Algorithmus ist konfigurierbar) könnte man es relativ generisch.
Wir regelmäßig analysieren 1GB+ komplexe XML-Dateien mit einem SAX-parser, die genau das macht, was du beschrieben hast: Es extrahiert partielle DOM-Bäume, die sich bequem abgefragt, die Verwendung von XPATH.
Ich festgefahren darüber hier - Es ist mit einem SAX nicht einen StAX-parser, kann aber sein, lohnt sich ein Blick auf.
Ist es definitiv ein Fall für XProc mit einem streaming und Parallelverarbeitung Umsetzung wie QuiXProc (http://code.google.com/p/quixproc)
In dieser situation, verwenden Sie
Können Sie auch wrapp jeder der resultierenden transformation mit einer einzigen Zeile von XProc
Hoffe, das hilft
Eine lustige Lösung für die Verarbeitung von großen XML-Dateien >10GB.
Details finden sich am Beispiel von wikipedia-dumps (17 GB), die in dieser SO beantworten https://stackoverflow.com/a/43367629/1485527
Streaming-Transformationen für XML (STX) könnte das sein, was Sie brauchen.
Tun, benötigen Sie es schnell oder Sie benötigen eine schnelle Suche in den Daten ? Diese Anforderungen bedürfen unterschiedlicher Herangehensweise.
Für schnelles Lesen der gesamten Daten StAX OK sein.
Wenn Sie schnelle lookups, als Sie brauchen konnten, um es zu laden, um einige Datenbank Berkeley DB XML z.B.