Разбор большого (~ 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) для анализа теги по порядку и построение табличных данных. Так как он может читать файл в строке за раз, длина файла не имеет значения, если итоговые данные с таблицами все вписываются в память.

  • Редактировать XML-файл на основе пути
  • Python + Expat: Error on & # 0; юридические лица
  • Библиотека обнаружения кодирования в python
  • Повторить извлечение текста с помощью Python
  • ElementTree-эквивалент iter () в Python2.6
  • Теги с: именем в lxml
  • Алгоритм анализа Python XML
  • Объединить два файла XML Python
  • QWebException: «Объект« NoneType »не может быть вызван» при оценке
  • Как анализировать XML из приложения Google для приложений Google?
  • parsing xml, содержащий пространство имен по умолчанию, чтобы получить значение элемента, используя lxml
  • Python - лучший язык программирования в мире.