Использовать iterparse:
import lxml.etree as ET
for event, elem in ET.iterparse(filelike_object):
if elem.tag == "a":
process_a(elem)
for child in elem:
process_child(child)
elem.clear() # destroy all child elements
elif elem.tag != "b":
elem.clear()
Обратите внимание, что это не экономит всю память, но я смог пройтись по XML-потокам через Gb, используя эту технику.
Попробуйте import xml.etree.cElementTree as ET
... он поставляется с Python, и его iterparse
быстрее, чем lxml.etree
iterparse
, согласно документам lxml :
"" "Для приложений, которым требуется высокая пропускная способность синтаксического анализатора больших файлов и которые практически не выполняют сериализацию, cET является лучшим выбором. Также для приложений iterparse, которые извлекают небольшие объемы данных или агрегируют информацию из больших наборов данных XML которые не помещаются в память. Однако, если речь идет о производительности в обоих направлениях, lxml в целом будет в несколько раз быстрее. Поэтому, когда входные документы не намного больше выходных, lxml является явным победителем. "" «