Какой наиболее эффективный способ извлечения информации из большого количества xml-файлов в python?

StackOverflow https://stackoverflow.com/questions/344559

Вопрос

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

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

Спасибо!

Это было полезно?

Решение

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

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

Редактировать:

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top