Может ли Python xml ElementTree проанализировать очень большой XML-файл?

Я пытаюсь разобрать большой файл (> 2 ГБ) структурированных данных разметки, и для этого недостаточно памяти. Это оптимальный способ анализа XML-класса для этого условия.

  • Python xml.etree getiterator эквивалентен C #
  • XML для CSV в Python
  • Подавление префиксов пространства имен в ElementTree 1.2
  • Порядок атрибутов настройки Elementtree
  • как мне сопоставить словарь, а не список?
  • Как сохранить отредактированный документ Word с помощью Python?
  • Как я могу вернуть XML из boto-вызовов?
  • Можно ли сохранить разделы CDATA в BeautifulSoup?
  • 3 Solutions collect form web for “Может ли Python xml ElementTree проанализировать очень большой XML-файл?”

    Проверьте iterparse() . Описание того, как вы можете использовать его для анализа очень больших документов, можно найти здесь .

    Большинство библиотек DOM, таких как ElementTree, строят всю модель документа в ядре. Традиционно, когда ваша модель слишком велика, чтобы сразу вписаться в память, вам нужно использовать более ориентированный на поток парсер, например xml.sax .

    Это часто бывает сложнее, чем вы ожидаете, особенно когда вы используете операции более высокого порядка, например, со всеми DOM сразу.

    Возможно ли, что ваш XML-документ довольно прост, как

     <entries> <entry>...</entry> <entry>...</entry> </entries> 

    что позволит вам работать над подмножествами данных в более дружественной форме ElementTree?

    Единственный API, который я видел, который может справиться с такой штукой, – это пулдолм:

    http://docs.python.org/library/xml.dom.pulldom.html

    Pulldom использует API SAX для создания частичных узлов DOM; потянув за определенные поддеревья в группу, а затем отбросив их, когда вы закончите, вы можете получить эффективность SAX памяти с разумностью использования DOM.

    Это неполный API; когда я использовал его, мне пришлось изменить его, чтобы он полностью использовался, но он работает как основа. Я больше не использую его, поэтому не помню, что я должен был добавить; просто предварительное предупреждение.

    Это очень медленно.

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

    Другой вариант – использование SAX API, но они представляют собой серьезную боль, чтобы сделать что-то нетривиальное с помощью напрямую.

    Python - лучший язык программирования в мире.