Что самый быстрый путь состоит в том, чтобы проанализировать большие документы XML в Python?

57
задан Matthew Murdoch 5 February 2019 в 03:27
поделиться

6 ответов

Я обращаюсь ко мне, как будто Вам не нужны никакие возможности DOM из Вашей программы. Я был бы второй использование (c) библиотеки ElementTree. При использовании iterparse функции cElementTree модуля можно проложить себе путь через xml и соглашение с событиями, как они происходят.

Примечание однако, совет Fredriks относительно использования функции cElementTree iterparse :

для парсинга больших файлов можно избавиться от элементов, как только you’ve обработал их:

for event, elem in iterparse(source):
    if elem.tag == "record":
        ... process record elements ...
        elem.clear()

вышеупомянутый шаблон имеет один недостаток; это не очищает корневой элемент, таким образом, Вы закончите с единственным элементом с большим количеством пустых дочерних элементов. Если Ваши файлы являются огромными, а не просто большими, это могло бы быть проблемой. Для работы вокруг этого необходимо достать корневой элемент. Самый легкий способ сделать это должно включить, запускают события и сохраняют ссылку на первый элемент в переменной:

# get an iterable
context = iterparse(source, events=("start", "end"))

# turn it into an iterator
context = iter(context)

# get the root element
event, root = context.next()

for event, elem in context:
    if event == "end" and elem.tag == "record":
        ... process record elements ...
        root.clear()

lxml.iterparse () не позволяет это.

предыдущее не работает над Python 3.7, рассматривает следующий способ получить первый элемент.

# get an iterable
context = iterparse(source, events=("start", "end"))

is_first = True

for event, elem in context:
    # get the root element
    if is_first:
        root = elm
        is_first = False
    if event == "end" and elem.tag == "record":
        ... process record elements ...
        root.clear()
65
ответ дан Cosmos Zhu 7 November 2019 в 06:05
поделиться

Вы попробовали cElementTree Модуль?

cElementTree включен с Python 2.5 и позже, как xml.etree.cElementTree. Относитесь сравнительные тесты .

удаленная мертвая ссылка ImageShack

15
ответ дан SuperBiasedMan 7 November 2019 в 06:05
поделиться

Я рекомендую Вам использовать lxml, это - привязка Python для libxml2 библиотеки, которая действительно быстра.

, По моему опыту, libxml2 и эмигрант имеют очень похожую производительность. Но я предпочитаю libxml2 (и lxml для Python), потому что это, кажется, более активно разрабатывается и тестируется. Также libxml2 имеет больше функций.

lxml является главным образом API, совместимым с xml.etree. ElementTree. И на ее веб-сайте существует хорошая документация.

8
ответ дан chrisguitarguy 7 November 2019 в 06:05
поделиться

Регистрация обратных вызовов замедляет парсинг чрезвычайно. [РЕДАКТИРОВАНИЕ], которое Это вызвано тем, что (быстрый) код C должен вызвать интерпретатор Python, который является просто не с такой скоростью, как C. В основном Вы используете код C, чтобы считать файл (быстро) и затем создать DOM в (медленном) Python. [/РЕДАКТИРОВАНИЕ]

Попытка использовать xml.etree. ElementTree, который реализован 100% в C и который может проанализировать XML без любых обратных вызовов к коду Python.

После того, как документ был проанализирован, можно отфильтровать его для получения то, что Вы хотите.

, Если это все еще слишком медленно и Вам не нужен DOM, другая опция состоит в том, чтобы считать файл в строку и использовать операции простой строки для обработки его.

5
ответ дан Aaron Digulla 7 November 2019 в 06:05
поделиться

Если Ваше приложение чувствительно к производительности и вероятно встретиться, большие файлы (как Вы сказал,> 1 ГБ), тогда, я буду сильно , отговаривают от использования кода, который Вы показываете в своем вопросе по простой причине, что это загружает весь документ в RAM. Я поощрил бы Вас заново продумать свой дизайн (если вообще возможный), чтобы не содержать целое дерево документов в RAM сразу. Не зная, каковы требования Вашего приложения, я не могу правильно предложить, чтобы любой определенный подход, кроме универсального совета попытался использовать "основанный на событии" дизайн.

4
ответ дан Matt Campbell 7 November 2019 в 06:05
поделиться

По-видимому PyRXP действительно быстр.

Они утверждают, что это - самый быстрый синтаксический анализатор - но cElementTree не находится в их списке статистики.

0
ответ дан Matthew Schinckel 7 November 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: