Я обращаюсь ко мне, как будто Вам не нужны никакие возможности 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()
Вы попробовали cElementTree Модуль?
cElementTree включен с Python 2.5 и позже, как xml.etree.cElementTree. Относитесь сравнительные тесты .
удаленная мертвая ссылка ImageShack
Я рекомендую Вам использовать lxml, это - привязка Python для libxml2 библиотеки, которая действительно быстра.
, По моему опыту, libxml2 и эмигрант имеют очень похожую производительность. Но я предпочитаю libxml2 (и lxml для Python), потому что это, кажется, более активно разрабатывается и тестируется. Также libxml2 имеет больше функций.
lxml является главным образом API, совместимым с xml.etree. ElementTree. И на ее веб-сайте существует хорошая документация.
Регистрация обратных вызовов замедляет парсинг чрезвычайно. [РЕДАКТИРОВАНИЕ], которое Это вызвано тем, что (быстрый) код C должен вызвать интерпретатор Python, который является просто не с такой скоростью, как C. В основном Вы используете код C, чтобы считать файл (быстро) и затем создать DOM в (медленном) Python. [/РЕДАКТИРОВАНИЕ]
Попытка использовать xml.etree. ElementTree, который реализован 100% в C и который может проанализировать XML без любых обратных вызовов к коду Python.
После того, как документ был проанализирован, можно отфильтровать его для получения то, что Вы хотите.
, Если это все еще слишком медленно и Вам не нужен DOM, другая опция состоит в том, чтобы считать файл в строку и использовать операции простой строки для обработки его.
Если Ваше приложение чувствительно к производительности и вероятно встретиться, большие файлы (как Вы сказал,> 1 ГБ), тогда, я буду сильно , отговаривают от использования кода, который Вы показываете в своем вопросе по простой причине, что это загружает весь документ в RAM. Я поощрил бы Вас заново продумать свой дизайн (если вообще возможный), чтобы не содержать целое дерево документов в RAM сразу. Не зная, каковы требования Вашего приложения, я не могу правильно предложить, чтобы любой определенный подход, кроме универсального совета попытался использовать "основанный на событии" дизайн.
По-видимому PyRXP действительно быстр.
Они утверждают, что это - самый быстрый синтаксический анализатор - но cElementTree не находится в их списке статистики.