Использование EXI: Как работать с большими файлами XML (~ 20 ГБ)?

В настоящее время я оцениваю EXI для сжатия больших файлов XML. Большой означает XML-файл с 20 ГБ (двадцать).

И кодеки сжатия EXI, и кодеки сжатия не-EXI (gzip/lzma) интегрированы в приложение Scala, работающее на виртуальной машине Java. GZIP и LZMA предоставляются с помощью commons-compress. Все кодеки реализованы на Java в этих сторонних библиотеках.

В 64-битной системе Linux с 8 ГБ (6 ГБ для JVM) и Exificient, и OpenExi могут кодировать, но не могут декодировать, когда исходный файл XML составляет около 10 ГБ.

  • Существенные сбои с OutOfMemory
  • OpenExi завершается с ошибкой ArrayIndexOutOfBoundsException: 1000000
  • Нет проблем с GZIP / LZMA

  • Oracle JDK: 1,8-8u40

  • Аргументы JVM: -Xmx6g -XX:+UseG1GC -XX:+UseStringDeduplication

  • Полученный файл XML в кодировке EXI имеет размер ~ 70 МБ

Мои вопросы:

  • Означает ли EXI (из-за его базового алгоритма), что использование памяти увеличивается по размеру входного файла XML? Если да, есть ли простая формула для расчета необходимой памяти?
  • Что-нибудь можно сделать, чтобы заставить это работать (кроме выделения большего количества памяти)?

1 ответ

Формат EXI предлагает "опции" для ограничения использования памяти.

https://www.w3.org/TR/exi/

valueMaxLength а также valuePartitionCapacity ограничить длину и количество записей в таблице строк EXI.

Например настройки valueMaxLength значение 16 означает, что строка не добавляется в таблицу, если она больше 16. Строки таблицы могут расти во время обработки и должны храниться в памяти до конца.

Опция valuePartitionCapacity ограничивает количество строк в таблице (круговой режим).

Когда используется сжатие EXI, пожалуйста, подумайте также, чтобы уменьшить blockSize,

Надеюсь это поможет,

- Даниэль

Другие вопросы по тегам