Por que é elementtree.ElementTree.iterparse usando tanta memória?
Eu estou usando elementtree.ElementTree.iterparse para analisar um arquivo xml grande (371 MB).
Meu código é basicamente isto:
outf = open('out.txt', 'w')
context = iterparse('copyright.xml')
context = iter(context)
dummy, root = context.next()
for event, elem in context:
if elem.tag == 'foo':
author = elem.text
elif elem.tag == 'bar':
if elem.text is not None and 'bat' in elem.text.lower():
outf.write(elem.text + '\n')
elem.clear() #line A
root.clear() #line B
Minha pergunta é dupla:
Primeiro - Preciso dos dois A e B (ver comentários de trechos de código)? Foi-me dito que root.clear () limpa crianças desnecessárias para que a memória não seja devorada, mas aqui estão minhas observações: usar B e não A é o mesmo que não usar nem em termos de consumo de memória (plotado com gerenciador de tarefas). Usar apenas A parece ser o mesmo que usar os dois.
Segundo - Por que isso ainda está consumindo tanta memória? Conforme o programa é executado, ele usa cerca de 100 MB de RAM no final.
Eu suponho que tenha algo a ver com outf, mas por quê? Não é só escrever no disco? E se estiver armazenando esses dados antes de fechar, como posso evitar isso?
Outras informações: Estou usando o Python 2.7.3 no Windows.