Использование 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 предлагает "опции" для ограничения использования памяти.
valueMaxLength
а также valuePartitionCapacity
ограничить длину и количество записей в таблице строк EXI.
Например настройки valueMaxLength
значение 16 означает, что строка не добавляется в таблицу, если она больше 16. Строки таблицы могут расти во время обработки и должны храниться в памяти до конца.
Опция valuePartitionCapacity
ограничивает количество строк в таблице (круговой режим).
Когда используется сжатие EXI, пожалуйста, подумайте также, чтобы уменьшить blockSize
,
Надеюсь это поможет,
- Даниэль