Как я могу эффективно проанализировать 200 000 XML-файлов в Java? - PullRequest
3 голосов
/ 05 апреля 2011

У меня 200 000 XML-файлов, которые я хочу проанализировать и сохранить в базе данных.

Вот один из примеров: https://gist.github.com/902292

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

Что мне интересно, так это:

1) Должен ли я использовать парсер DOM или SAX?DOM кажется проще и быстрее, так как каждый XML маленький.

2) Где находится простое руководство по указанному парсеру?(DOM или SAX)

Спасибо

EDIT

Я пробовал маршрут DOM, хотя все предлагали SAX.Главным образом потому, что я нашел «более простое» учебное пособие для DOM и подумал, что, поскольку средний размер файла составляет около 3–4 тыс., Он легко сможет хранить это в памяти.

Однако я написал рекурсивную процедуру дляобрабатывают все файлы размером 200 тыс., и он проходит около 40% их пути, а затем Java исчерпывает память.

Вот часть проекта.https://gist.github.com/905550#file_xm_lparser.java

Должен ли я отказаться от DOM сейчас и просто использовать SAX?Просто кажется, что с такими маленькими файлами DOM должен справиться с этим.

Кроме того, скорость равна " достаточно быстро ".Для анализа 2000 XML-файлов требуется около 19 секунд (до вставки Mongo).

Спасибо

Ответы [ 6 ]

4 голосов
/ 05 апреля 2011

Почему бы не использовать правильную базу данных XML (например, Berkeley DB XML )?Затем вы можете просто выгружать документы напрямую и создавать индексы по мере необходимости (например, на HotelID).

3 голосов
/ 05 апреля 2011

разделяй и властвуй Разделите 200 000 файлов на несколько сегментов и распараллелите анализ / вставку. Посмотрите на Java 5 Executors , если вы хотите сохранить простоту, или используйте spring-batch , если это повторяющаяся задача, и в этом случае вы можете воспользоваться инфраструктурой высокого уровня.

API

Использование SAX может помочь, но не обязательно, так как вы не собираетесь хранить проанализированную модель (т. Е. Все, что вы делаете, это анализ, вставка и затем отпускание проанализированных данных, когда объекты имеют право на сборщик мусора) , Посмотрите на простой API, такой как JDOM .

Другие идеи

Вы можете реализовать модель типа производитель / потребитель, в которой производитель производит созданное после анализа pojo, а потребитель берет pojo и вставляет их в базу данных. Преимущество здесь в том, что вы можете пакетно вставить s , чтобы увеличить производительность.

2 голосов
/ 05 апреля 2011

SAX всегда бьет DOM на скорости.Но так как вы говорите, что файлы XML маленькие, вы можете продолжить работу с DOM-парсером.Одна вещь, которую вы можете сделать для ускорения, - это создать Thread-Pool и выполнять в нем операции базы данных.Многопоточные обновления значительно улучшат производительность.

  • Лалит
2 голосов
/ 05 апреля 2011

Перейти с SAX, или, если хотите, StAX.Забудьте о DOM.Используйте эффективную библиотеку, такую ​​как aalto .

Я уверен, что анализ будет довольно дешевым по сравнению с выполнением запросов к базе данных.

Но 200k не такое большое число, если вам нужно сделать это только один раз.

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

StAX быстрее, чем SAX, и это намного быстрее, чем DOM.Если производительность очень важна, вы также можете подумать о создании специального компилятора для анализа файлов XML.Но обычно лексизация и синтаксический анализ - это не столько проблема StAX, сколько «последующая обработка».

0 голосов
/ 05 апреля 2011

SAX будет быстрее, чем DOM, это может быть проблемой, если у вас есть 200 000 файлов для анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...