У меня есть большой XML-файл (1 ГБ). Я должен сделать много запросов на этом XML-файле (использующий xpath, например). Результатами являются мелкие детали xml. Я хочу, чтобы запросы были максимально быстро, но файл на 1 ГБ является, вероятно, слишком большим для оперативной памяти.
xml выглядит примерно так:
<all>
<record>
<id>1</id>
... lots of fields. (Very different fields per record including (sometimes) subrecords
so mapping on a relational database would be hard).
</record>
<record>
<id>2</id>
... lots of fields.
</record>
.. lots and lots and lots of records
</all>
Мне нужен произвольный доступ, выбирая записи, использующие, например, в качестве ключа. (Идентификатор является самым важным, но другие поля могли бы использоваться в качестве ключа также). Я не знаю запросов заранее, они прибывают и должны быть выполнены как можно скорее, никакое выполнение пакета, но реальное время. SAX не выглядит очень перспективным, потому что я не хочу перечитывать весь файл для каждого запроса. Но DOM не выглядит очень перспективным также, потому что файл является очень большой и добавляющей дополнительной структурой, наверху будет почти наверняка означать, что это не собирается помещаться в оперативную память.
Какой библиотекой Java / подход я мог пользоваться лучше всего для решения этой проблемы?
vtd-xml лучше всего подходит для вашего случая использования. http://vtd-xml.sourceforge.net/
При обработке XML обычно используются два подхода: потоковая передача (SAX) или загрузка всего документа в память (различные реализации DOM).
Если вы можете заранее установить набор запросов для массовой обработки, вы можете написать программу, использующую SAX для потоковой передачи файла в поисках совпадений. Если запросы поступают через случайные промежутки времени (например, типичное приложение базы данных), вам нужно будет либо загрузить весь документ в память, либо предварительно обработать XML-документ в какой-либо базе данных.
Лучшее описание того, чего вы пытаетесь достичь, может помочь получить более точные ответы.
Piccolo - небольшой, чрезвычайно быстрый синтаксический анализатор XML для Java. Он реализует интерфейсы SAX 1, SAX 2.0.1 и JAXP 1.1 (только синтаксический анализ SAX)
как не проверяющий синтаксический анализатор. Он доступен по лицензии Apache
в зависимости от приложения, использующего xml-ориентированную базу данных, такую как http://exist.sourceforge.net/, может быть интересной.