Случайный доступ к большим файлам XML - PullRequest
4 голосов
/ 05 мая 2011

У меня есть набор инструментов, которые индексируют большой XML-файл (файлы дампа MediaWiki) и используют эти индексы для произвольного доступа к отдельным записям, хранящимся в файле. Это работает очень хорошо, но я «разбираю» XML с помощью строковых функций и / или регулярных выражений, а не реальный анализатор XML, который является хрупким решением, если способ создания файлов будет изменен в будущем.

Есть ли у некоторых или большинства анализаторов XML такие способы?

(У меня есть версии моих инструментов, написанные на C, Perl и Python. Разбирать файлы целиком в какую-либо базу данных или отображать их в памяти нет вариантов.)

UPDATE

Вот приблизительная статистика для сравнения: файлы, которые я использую, в основном публикуются каждую неделю или около того, размер текущего составляет 1 918 212 991 байт. C-версия моего инструмента индексирования занимает несколько минут на моем нетбуке и должна запускаться только один раз для каждого нового опубликованного XML-файла. Реже я использую те же инструменты в другом XML-файле, текущий размер которого составляет 30 565 654 976 байт и обновлен только 8 раз в 2010 году.

Ответы [ 5 ]

1 голос
/ 02 января 2013

VTD-XML выглядит первой серьезной попыткой решения этой проблемы:

Самый эффективный в мире объем памяти (1,3x ~ 1,5x размера XML-документа) синтаксический анализатор XML с произвольным доступом .

(VTD-XML даже имеет свои собственныеотметьте здесь на StackOverflow, чтобы вы могли следить за квестами и т. д .: )

1 голос
/ 16 августа 2011

Если вы используете Python, попробуйте lxml - он очень быстрый и гибкий, и он сравнительно хорошо сравнится с регулярными выражениями для скорости.Гораздо быстрее, чем альтернативы, на любом языке - без компромиссов.

Используйте iterparse для просмотра статей в википедии.

Обратите внимание, что это не дает вам произвольный доступ к статьям в вашем дампе (это вполне разумный запрос!) - но iterparse даст вам быстрый и простой в использовании курсор «только вперед» ... и lxml может быть подходящим инструментом для анализа фрагментов, которые fseek'd выполняет другими способами.

Вот лучшая документация, которую я нашел для него:

http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html

(попробуйте PDF-версию)

Теперь это часть стандартного Pythonраспределение.

1 голос
/ 05 мая 2011

Я думаю, что вы должны хранить эти данные в базе данных XML, такой как exist-DB, а не создавать свои собственные инструменты для выполнения очень небольшого подмножества того, что дает вам база данных XML.

0 голосов
/ 05 мая 2011

XPath намного лучше, чем "синтаксический анализ" строк / регулярных выражений, но xpath работает с XML-документами, которые сначала анализируются в DOM памяти, если ваши документы действительно большие, у вас могут возникнуть проблемы с памятью.

0 голосов
/ 05 мая 2011

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

Регулярному выражению также требуется загрузка всей строки в память. Это все же лучше, чем DOM, поскольку DOM обычно занимает в 3-4 раза больше памяти, чем размер файла XML.

Типичным решением для этих случаев является SAX , где у них действительно небольшой отпечаток памяти , но они похожи на курсор только вперед: следовательно, вы не получаете случайный доступ, вы придется пройти через дерево, чтобы добраться туда, куда вам нужно Если вы используете .NET, вы можете использовать XmlTextReader.

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

...