Каков наиболее эффективный способ извлечения информации из большого количества XML-файлов в Python? - PullRequest
3 голосов
/ 05 декабря 2008

У меня есть полный каталог (~ 10 3 , 10 4 ) файлов XML, из которого мне нужно извлечь содержимое нескольких полей. Я тестировал разные xml-анализаторы, и, поскольку мне не нужно проверять содержимое (дорого), я подумал о том, чтобы просто использовать xml.parsers.expat (самый быстрый) для просмотра файлов, один за другим, чтобы извлечь данные.

  1. Есть ли более эффективный способ? (простое сопоставление текста не работает)
  2. Нужно ли выдавать новый ParserCreate () для каждого нового файла (или строки) или я могу использовать один и тот же для каждого файла?
  3. Любые предостережения?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 08 декабря 2008

Как правило, я бы предложил использовать ElementTree's iterparse или, в качестве дополнительной скорости, его аналог из lxml . Также попробуйте использовать Обработка (поставляется с 2.6) для распараллеливания.

Важной особенностью iterparse является то, что вы получаете элемент (под) структуры при их разборе.

import xml.etree.cElementTree as ET
xml_it = ET.iterparse("some.xml")
event, elem = xml_it.next()

event всегда будет строкой "end" в этом случае, но вы также можете инициализировать синтаксический анализатор, чтобы также сообщать вам о новых элементах при их разборе. У вас нет никаких гарантий, что все дочерние элементы будут проанализированы в этот момент, но атрибуты есть, если вас это только интересует.

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

Если файлы большие (они?), Существует общая идиома, позволяющая поддерживать постоянную загрузку памяти, как в потоковом парсере.

3 голосов
/ 05 декабря 2008

Самый быстрый способ - сопоставить строки (например, с регулярными выражениями) вместо анализа XML - в зависимости от ваших XML это может сработать.

Но самое главное: вместо того, чтобы продумать несколько вариантов, просто реализуйте их и распределите по времени на небольшой набор. Это займет примерно столько же времени и даст вам реальные цифры, которые приведут вас вперед.

EDIT:

  • Файлы находятся на локальном или сетевом диске? Сетевой ввод / вывод убьет вас здесь.
  • Проблема распараллеливается тривиально - вы можете разделить работу между несколькими компьютерами (или несколькими процессами на многоядерном компьютере).
1 голос
/ 06 декабря 2008

Одна вещь, которую вы не указали, - читаете ли вы XML в DOM или нет. Я предполагаю, что вы, вероятно, нет, но на случай, если вы, не так. Вместо этого используйте xml.sax. Использование SAX вместо DOM значительно повысит производительность.

1 голос
/ 05 декабря 2008

Если вы знаете, что файлы XML генерируются с использованием одного и того же алгоритма, может быть более эффективно вообще не выполнять синтаксический анализ XML. Например. если вы знаете, что данные находятся в строках 3, 4 и 5, вы можете прочитать файл построчно, а затем использовать регулярные выражения.

Конечно, такой подход потерпит неудачу, если файлы не будут сгенерированы машиной или получены из разных генераторов, или если генератор изменяется со временем. Однако я настроен оптимистично, что будет более эффективным.

Независимо от того, утилизируете ли вы объекты парсера или нет, это не имеет значения. Будет создано гораздо больше объектов, поэтому один объект синтаксического анализа не имеет большого значения.

...