Почему 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, но почему? Разве это не просто запись на диск? И если он хранит эти данные до закрытия, как я могу избежать этого?

Дополнительная информация: Я использую Python 2.7.3 для Windows.

2 Solutions collect form web for “Почему elementtree.ElementTree.iterparse использует так много памяти?”

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

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

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

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

  • Анализ XML в Python с использованием примера ElementTree
  • Автоматическая проверка XSD
  • питон. как получить значение атрибута с помощью libxml2
  • Разбор дерева ad hoc
  • Редактировать XML-файл на основе пути
  • Is & # x10; допустимый символ в XML?
  • Эффективно сравнить два файла XML в python
  • анализ утечки памяти xml с помощью xml.dom.minidom
  •  
    Interesting Posts for Van-Lav

    DatabaseError: таблица OmniCloud_App_user не имеет имени с именем пользователя

    Почему такие языки, как Java, используют иерархические имена пакетов, а Python – нет?

    Почему я получаю объект «_SIGCHLDWaker» не имеет атрибута «doWrite» в Scrapy?

    Установка пакета Ephem в Python 3

    Быстрый способ разделения буквенных и числовых символов в строке python

    Изменение 64-битного реестра с 32-битного Python

    Чтение командной строки Аргументы другого процесса (код Win32 C)

    Можно ли узнать, функциональны ли две функции python?

    как скопировать только верхние треугольные значения в массив из numpy.triu ()?

    Добавление дополнительных контурных линий с использованием matplotlib 2D контурной графики

    Входные и выходные массивы numpy для h5py

    Как обновить версию Python?

    Понимание атрибутов класса python

    Вычисление разницы во времени между событиями в пандах

    Кто-нибудь знает хороший хак, чтобы сделать django-registration использовать электронные письма как имена пользователей?

    Python - лучший язык программирования в мире.