Быстрый способ загрузки большого корпуса XML-файлов?

#java #xml #lucene

#java #xml #lucene

Вопрос:

У меня есть большой корпус xml-файлов (~ 20 000 файлов). Когда я загружаю весь корпус, мне требуется около ~ 1 секунды для загрузки каждого документа. XML-файлы довольно большие. (> 10 000 строк). Каждый xml представляет документ с узлами для предложений, токенами в предложении и другими подобными атрибутами.

Я использую DocumentBuilder на java для загрузки xml. После загрузки xml мне также нужно извлечь некоторые соответствующие xml-узлы (около 100 предложений). Для этого я использовал getElementsByTagName().

Существует ли более быстрый способ загрузки XML-документов на java?

Комментарии:

1. вы имеете в виду для загрузки xml? больше ничего. Я подумываю об индексации XML-документов с помощью lucene, но мне интересно, есть ли альтернатива.

2. Я считаю, что XML — это наиболее эффективный формат файла для загрузки по сравнению с JSON и YAML, что касается фактической загрузки, почему бы не попробовать несколько методов и не провести некоторый сравнительный анализ?

3. Под несколькими методами вы подразумеваете использование других XML-библиотек в Java?

4. Рассмотрите возможность изучения XSLT, особенно если он может передаваться в потоковом режиме.

5. @Unihedron, все наоборот, анализаторы JSON обычно работают быстрее, чем XML.

Ответ №1:

Вы можете рассмотреть реализацию SAX. SAX обычно работает в 2-5 раз быстрее по этой ссылке: http://dublintech.blogspot.be/2011/12/jaxb-sax-dom-performance.html. Это имеет большой смысл, когда вам нужно фактически обработать только часть вашего документа, а не все содержимое.

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

Если у вас медленные диски, возможно, имеет смысл даже заархивировать их все в большом zip-файле, что сократит доступ к диску на 80-90%. Накладные расходы на распаковку должны быть компенсированы увеличением производительности доступа к диску.

Но утверждение, что вы также рассматриваете Lucene, на самом деле подразумевает, что мы упускаем некоторую важную информацию о вашем варианте использования, потому что это подразумевает, что действие, которое вы оптимизируете, в любом случае является более или менее «одноразовым».

Если вам действительно нужна только относительно небольшая часть содержимого вашего документа, вы также можете рассмотреть возможность хранения этой информации в одной структуре данных и сериализации ее. Таким образом, вам нужно десериализовать только один файл и не обрабатывать 20 000 XML-документов. На случай изменения документов вы также можете сохранить пути к документам и хэш-код типа MD5 для обнаружения измененных документов.

Комментарии:

1. «потому что это подразумевает, что действие, которое вы оптимизируете, в любом случае является более или менее «одноразовым»» Я не понял эту часть. При необходимости я могу добавить больше информации о моем варианте использования.

2. Основной вопрос: вы делаете это один раз во время запуска вашего приложения? Если это так, и предполагается, что приложение будет работать в течение длительного времени (например, недели для веб-сервера), то слишком усердно пытаться оптимизировать, возможно, не очень хорошая идея. Примечание: я добавил альтернативное решение.