Разбор большого (~ 40 ГБ) текстового XML-файла в python

У меня есть XML-файл, который я хочу проанализировать с помощью python. Каков наилучший способ сделать это? Взяв в память весь документ, будет катастрофическим, мне нужно как-то прочитать его за один узел за раз.

Существующие XML-решения, о которых я знаю:

  • дерево элементов
  • minixml

но я боюсь, что они не собираются работать из-за проблемы, о которой я говорил. Также я не могу открыть его в текстовом редакторе – какие-нибудь хорошие подсказки в generao для работы с гигантскими текстовыми файлами?

2 Solutions collect form web for “Разбор большого (~ 40 ГБ) текстового XML-файла в python”

Во-первых, попробовали ли вы ElementTree (либо встроенные версии pure-Python, либо C, или, лучше, версию lxml )? Я почти уверен, что никто из них не прочитал весь файл в памяти.

Проблема, конечно, в том, что, независимо от того, читает ли он весь файл в памяти, результирующее анализируемое дерево заканчивается в памяти.

ElementTree имеет отличное решение, которое довольно простое и часто достаточно: iterparse .

 for event, elem in ET.iterparse(xmlfile, events=('end')): ... 

Ключевым моментом здесь является то, что вы можете модифицировать дерево по мере его создания (путем замены содержимого сводкой, содержащей только то, что потребуется родительскому узлу). Выбрасывая все, что вам не нужно хранить в памяти, когда оно приходит, вы можете придерживаться разбора вещей в обычном порядке, не исчерпывая память.

Связанная страница дает более подробную информацию, включая некоторые примеры для изменения XML-RPC и plist по мере их обработки. (В таких случаях проще сделать результирующий объект более простым, а не экономить память, но их должно быть достаточно, чтобы получить эту идею).

Это только помогает, если вы можете придумать способ подвести итоги по ходу дела. (В самом тривиальном случае, когда родитель не нуждается в информации от своих детей, это просто elem.clear() .) В противном случае это не сработает для вас.

Стандартным решением является SAX , который является API-интерфейсом, основанным на обратном вызове , который позволяет вам управлять деревом узла за раз. Вам не нужно беспокоиться об усечении узлов, как и при использовании iterparse, потому что узлы не существуют после того, как вы их разобрали.

Большинство лучших примеров SAX есть для Java или Javascript, но их не так сложно понять. Например, если вы посмотрите на http://cs.au.dk/~amoeller/XML/programming/saxexample.html, вы должны выяснить, как записать его на Python (если вы знаете, где найти документация для xml.sax ).

Есть также некоторые библиотеки на основе DOM, которые работают, не читая все в памяти, но я не знаю, что я могу доверять, чтобы обрабатывать 40-гигабайтный файл с разумной эффективностью.

Лучшее решение будет частично зависеть от того, что вы пытаетесь сделать, и насколько бесплатны ваши системные ресурсы. Преобразование его в postgresql или подобную базу данных может быть плохой первой целью; с другой стороны, если вам просто нужно вытащить данные один раз, это, вероятно, не понадобится. Когда мне приходится разбирать большие XML-файлы, особенно когда задача состоит в обработке данных для графиков или тому подобного, я обычно конвертирую xml в S-выражения, а затем использую интерпретатор S-expression (реализованный на python) для анализа теги по порядку и построение табличных данных. Так как он может читать файл в строке за раз, длина файла не имеет значения, если итоговые данные с таблицами все вписываются в память.

  • Выборочно отображать или скрывать кнопку в дереве в OpenERP
  • Удаление пробелов в строке XML
  • Python - анализ файла, который содержит несколько частей xml
  • Каков самый быстрый способ анализа больших XML-документов в Python?
  • Лучший способ генерации xml?
  • Создание файла XML из данных модели
  • Обработка XML в Python
  • Порядок атрибутов настройки Elementtree
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.