Я использую elementtree.ElementTree.iterparse для анализа большого (371 МБ) XML-файла.
Мой код в основном таков:
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
Мой вопрос двоякий:
Во-первых, нужны ли мне и A, и B (см. комментарии к фрагменту кода)? Мне сказали, что root.clear() очищает ненужные дочерние элементы, поэтому память не потребляется, но вот мои наблюдения: использование B, а не A, равнозначно использованию ни с точки зрения потребления памяти (график с диспетчером задач). Использование только A похоже на использование обоих.
Во-вторых, почему это все еще потребляет так много памяти? Когда программа работает, она использует около 100 МБ ОЗУ ближе к концу.
Я предполагаю, что это как-то связано с outf, но почему? Разве это не просто запись на диск? И если он сохраняет эти данные до закрытия outf, как я могу этого избежать?
Дополнительная информация: Я использую Python 2.7.3 в Windows.