Python исчерпал память, анализируя XML, используя cElementTree.iterparse
Упрощенная версия моей функции разбора XML находится здесь:
import xml.etree.cElementTree as ET
def analyze(xml):
it = ET.iterparse(file(xml))
count = 0
for (ev, el) in it:
count += 1
print('count: {0}'.format(count))
Это приводит к тому, что Python исчерпывает память, что не имеет большого смысла. Единственное, что я на самом деле храню, это число, целое число. Почему он это делает:
![enter image description here]()
Увидите это внезапное падение памяти и использование ЦП в конце? Этот Python грохот. По крайней мере, он дает мне MemoryError
(в зависимости от того, что еще я делаю в цикле, он дает мне более случайные ошибки, такие как IndexError
) и трассировку стека вместо segfault. Но почему это рушится?
Ответы
Ответ 1
Документация сообщает вам: "Парширует раздел XML в дереве элементов [мой акцент] постепенно", но не охватывает, как избегайте сохранения неинтересных элементов (которые могут быть все из них). Это описано этой статьей effbot.
Я настоятельно рекомендую, чтобы кто-нибудь, использующий .iterparse()
, должен был читать эту статью Лизы Дейли. Он охватывает как lxml
, так и [c] ElementTree.
Предыдущее покрытие на SO:
Использование Python Iterparse для больших файлов XML
Может ли Python xml ElementTree анализировать очень большой XML файл?
Каков самый быстрый способ анализа больших XML-документов в Python?
Ответ 2
Пример кода:
import xml.etree.cElementTree as etree
def getelements(filename_or_file, tag):
context = iter(etree.iterparse(filename_or_file, events=('start', 'end')))
_, root = next(context) # get root element
for event, elem in context:
if event == 'end' and elem.tag == tag:
yield elem
root.clear() # preserve memory