Analysieren von großem (30 GB) XML in CSV (mit Python)

Ich muss eine sehr große XML-Datei von 30 GB in CSV analysieren. Ich habe 15 GB RAM zur Verfügung. Ich habe mir einige Alternativen angesehen, zum Beispiel xmltodict, das eine Art Streaming-Option hat, aber dies erstellt ein Wörterbuch, das ich dann nicht laden kann, um es als CSV zu speichern.

Welche Tools sind verfügbar (vorzugsweise in Python), um so große XML-Dateien in CSV zu analysieren, wo es aufgrund von RAM-Beschränkungen nicht möglich ist, die Datei zu laden oder zu verarbeiten?

Antworten (2)

Eine Möglichkeit ist ein XSLT 3.0-Streaming-Prozessor, der angesichts Ihrer Einschränkungen in der Praxis Saxon/C Enterprise Edition bedeutet (dieser hat eine Python-Sprachbindung).

Es gibt tatsächlich ein CSV-zu-XML-Stylesheet, das als funktionierendes Beispiel in der XSLT 3.0-Spezifikation veröffentlicht wurde, aber leider kein Gegenstück, um das Gegenteil zu tun. Sie können das Prinzip jedoch in einigen der Antworten hier sehen:

https://stackoverflow.com/questions/365312/xml-to-csv-using-xslt

oder hier:

https://stackoverflow.com/questions/15226194/xml-to-csv-using-xslt

Um den Code streamfähig zu machen, besteht die wichtigste Einschränkung darin, dass jede Vorlagenregel oder for-eachAnweisung, die ein bestimmtes Element verarbeitet, nur eine Traversierung der untergeordneten Elemente des Elements durchführen kann. Das bedeutet, dass Sie beispielsweise nicht einen Durchlauf der Quell-XML durchführen können, um die Feldnamen zu ermitteln, und dann einen weiteren Durchlauf, um die Werte zu verarbeiten.

Hinweis: Saxon-EE ist ein kommerzielles Produkt und ich habe ein kommerzielles Interesse daran.

Die XML-Utilities- Bibliothek ist einen Versuch wert, wenn man von einer gültigen und flachen XML-Struktur ausgeht - sie enthält sogar ein xml2csv-Kommandozeilen-Dienstprogramm.

Darin heißt es konkret:

xmlutils.py ist eine Reihe von Python-Dienstprogrammen zum seriellen Verarbeiten von XML-Dateien, um sie in verschiedene Formate (SQL, CSV, JSON) zu konvertieren. Die Skripte verwenden ElementTree.iterparse(), um Knoten in einem XML-Dokument zu durchlaufen, sodass nicht das gesamte DOM in den Speicher geladen werden muss. Die Skripte können verwendet werden, um große XML-Dateien ohne Speicherprobleme zu durchlaufen (auch wenn es lange dauert :P).