Подтвердить что ты не робот

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. Но почему это рушится?

4b9b3361

Ответ 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