Попробуйте использовать fast_iter Лизы Дали *:
def fast_iter(context, func, args=[], kwargs={}):
# http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
# Author: Liza Daly
for event, elem in context:
func(elem, *args, **kwargs)
elem.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
del context
fast_iter
удаляет элементы из дерева после того, как они были проанализированы, а также предыдущие элементы (возможно, с другими тегами), которыебольше не нужен.
Можно использовать так:
import lxml.etree as ET
def process_element(elem):
...
context=ET.iterparse(filename, events=('end',), tag=...)
fast_iter(context, process_element)