Почему elementtree.ElementTree.iterparse использует так много памяти?

Я использую 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.


person russell    schedule 26.06.2012    source источник


Ответы (2)


(Публикованный код с отступом во второй строке не должен выполняться.) http://bugs.python.org/issue14762 была похожей проблемой, и ответ заключается в том, что вы должны очистить каждый элемент (строка A). Не видя, что такое outf (или код, который его создал), трудно ответить на второй вопрос. Если бы это был объект StringIO, ответ был бы очевиден. Вы можете взглянуть на учебник, указанный во втором сообщении о проблеме с трекером:

http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/

person Terry Jan Reedy    schedule 26.06.2012
comment
Спасибо за первую часть. Во второй части я отредактировал вопрос, включив в него строку кода, которая создала outf. - person russell; 27.06.2012

Вместо этого используйте xml.etree.cElementTree.iterparse() [в Python 2.x].

Жизнь слишком коротка, чтобы отлаживать чужие ошибки.

person smci    schedule 18.08.2014
comment
В Python 3 явное использование cElementTree не рекомендуется. Я считаю, что он используется автоматически, когда он доступен. - person Terry Jan Reedy; 14.09.2014