XML: обработка больших данных - PullRequest
3 голосов
/ 20 февраля 2010

Какой XML-парсер вы порекомендуете для следующих целей:

XML-файл (отформатированный, содержащий пробелы) составляет около 800 МБ. В основном он содержит три типа тегов (назовем их n, w и r). У них есть атрибут id, который я должен был бы найти как можно быстрее.

Удаление ненужных атрибутов может сэкономить около 30%, а может и чуть больше.

Первая часть для оптимизации второй части: Есть ли какой-нибудь хороший инструмент (командной строки linux и windows, если возможно) для простого удаления неиспользуемых атрибутов в определенных тегах? Я знаю, что XSLT можно использовать. Или есть легкие альтернативы? Кроме того, я мог бы разделить его на три файла, по одному для каждого тега, чтобы получить скорость для последующего анализа ... Скорость не слишком важна для подготовки данных, конечно, было бы неплохо, если бы это заняло несколько минут, а не часов.

Вторая часть: Как только я подготовлю данные, будь они сокращены или нет, я смогу найти упомянутый мной атрибут ID, который является критичным по времени.

Оценки с использованием wc -l говорят мне, что существует около 3M N-тегов и около 418K W-тегов. Последние могут содержать до 20 субтегов каждый. W-теги также содержат некоторые, но они будут удалены.

«Все, что мне нужно сделать» - это переходить между тегами, содержащими определенные атрибуты id. Некоторые теги имеют ссылки на другие идентификаторы, поэтому дают мне дерево, может быть, даже график. Исходные данные большие (как уже упоминалось), но набор результатов не должен быть слишком большим, поскольку мне нужно только выделить некоторые элементы.

Теперь вопрос: какую библиотеку синтаксического анализа XML я должен использовать для такого рода обработки? Я бы в первую очередь использовал Java 6, имея в виду его перенос на BlackBerry.

Может быть полезно просто создать плоский файл, индексирующий идентификаторы и указывающий на смещение в файле? Есть ли необходимость в оптимизации, упомянутой в верхней части? Или, как известно, парсер работает с исходными данными так же быстро?

Небольшое примечание: для проверки я взял идентификатор, находящийся в самой последней строке файла, и искал идентификатор с помощью grep. На Core 2 Duo это заняло около минуты.

Что произойдет, если файл станет еще больше, скажем, 5 ГБ?

Я ценю любое уведомление или рекомендацию. Большое спасибо всем заранее и всего наилучшего

Ответы [ 6 ]

4 голосов
/ 20 февраля 2010

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

Чтобы обработать это как XML, единственный практический способ - использовать SAX-парсер. Сборка API Java в SAX-парсере вполне способна справиться с этим, поэтому нет необходимости устанавливать какие-либо сторонние библиотеки.

1 голос
/ 27 февраля 2010

«Я могу разбить его на три файла»

Попробуйте XmlSplit. это программа командной строки с опциями для указания, где разделить по элементам, атрибутам и т. д. Google, и вы должны найти его. Очень быстро тоже.

1 голос
/ 20 февраля 2010

Какой XML-парсер вы порекомендуете для следующих целей: XML-файл (отформатированный, содержащий пробелы) составляет около 800 МБ.

Возможно, вам стоит взглянуть на VTD-XML: http://en.wikipedia.org/wiki/VTD-XML (см. http://sourceforge.net/projects/vtd-xml/ для загрузки)

В основном он содержит три типа тегов (назовем их n, w и r). У них есть атрибут id, который я должен был бы найти как можно быстрее.

Я знаю, что это богохульство, но вы рассматривали awk или grep для предварительной обработки? Я имею в виду, я знаю, что вы не можете на самом деле анализировать xml и обнаруживать ошибки во вложенных структурах, таких как XML, но, возможно, ваш XML находится в такой форме, что это может оказаться возможным?

Я знаю, что XSLT можно использовать. Или есть легкие альтернативы?

Насколько я знаю, процессоры XSLT работают с деревом DOM исходного документа ... поэтому им нужно будет проанализировать и загрузить весь документ в память ... вероятно, не очень хорошая идея для такого большого документа ( или, может быть, у вас достаточно памяти для этого?) Существует что-то, называемое потоковым XSLT, но я думаю, что техника довольно молодая и не так много реализаций, нет свободного AFAIK, чтобы вы могли попробовать.

1 голос
/ 20 февраля 2010

Большие XML-файлы и пространство кучи Java - проблема. StAX работает с большими файлами - он, безусловно, обрабатывает 1 ГБ без век. Здесь есть полезная статья на тему использования StAx: XML.com , которая заставила меня приступить к работе за 20 минут.

1 голос
/ 20 февраля 2010

Я использую XMLStarlet (http://xmlstar.sourceforge.net/) для работы с огромными файлами XML. Есть версии для Linux и Windows.

0 голосов
/ 20 февраля 2010

xslt имеет тенденцию быть сравнительно быстрым даже для больших файлов. Для больших файлов хитрость заключается не в том, чтобы сначала создать DOM. Используйте источник URL или источник потока для передачи преобразователю.

Чтобы удалить пустые узлы и ненужные атрибуты, начните с шаблона Identity Transform и отфильтруйте их. Затем используйте XPATH для поиска необходимых тегов.

Вы также можете попробовать несколько вариантов:

  • Разделите большие XML-файлы на более мелкие и сохраните их состав, используя XML-Include. Это очень похоже на разделение больших исходных файлов на более мелкие и использование концепции включения «x.h». Таким образом, вам, возможно, не придется иметь дело с большими файлами.

  • Когда вы запускаете XML через Identity Transform, используйте его, чтобы назначить UNID для каждого интересующего узла, используя функцию generate-id ().

  • Создание таблицы базы данных внешнего интерфейса для поиска. Используйте сгенерированный выше UNID для быстрого определения местоположения данных в файле.

...