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?
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-each
Anweisung, 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).