Разбор большого (30 ГБ) XML в CSV (с Python)

Мне нужно разобрать очень большой файл XML размером 30 ГБ в CSV. У меня есть 15 ГБ оперативной памяти. Я рассматривал некоторые альтернативы, например xmltodict, у которого есть какая-то опция потоковой передачи, но при этом создается словарь, который я не могу загрузить, чтобы сохранить его как CSV.

Какие инструменты доступны (предпочтительно на Python) для анализа таких больших файлов XML в CSV, где невозможно загрузить или обработать файл из-за ограничений ОЗУ?

Ответы (2)

Одной из возможностей является потоковый процессор XSLT 3.0, который, учитывая ваши ограничения, означает на практике Saxon/C Enterprise Edition (это имеет привязку к языку Python).

На самом деле существует таблица стилей CSV-to-XML, опубликованная в качестве рабочего примера в спецификации XSLT 3.0, но, к сожалению, нет аналога для обратного. Однако вы можете увидеть принцип в некоторых ответах здесь:

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

или здесь:

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

Чтобы сделать код потоковым, ключевым ограничением является то, что любое правило шаблона или for-eachинструкция, обрабатывающая конкретный элемент, может выполнить только один обход дочерних элементов элемента. Это означает, что вы не можете, например, выполнить один проход исходного XML для обнаружения имен полей, а затем еще один проход для обработки значений.

Примечание: Saxon-EE является коммерческим продуктом, и у меня есть к нему коммерческий интерес.

Библиотеку XML Utilities стоит попробовать, принимая во внимание правильную и плоскую структуру XML — она даже поставляется с утилитой командной строки xml2csv.

В нем конкретно говорится:

xmlutils.py — это набор утилит Python для последовательной обработки xml-файлов с целью их преобразования в различные форматы (SQL, CSV, JSON). Сценарии используют ElementTree.iterparse() для перебора узлов в XML-документе, поэтому нет необходимости загружать весь DOM в память. Скрипты можно использовать для обработки больших XML-файлов (хотя это и занимает много времени :P) без сбоев памяти.