使用EXI:如何处理大型XML文件(约20 GB)?

时间:2017-06-30 09:19:36

标签: xml large-files exi exificient openexi

我目前正在评估EXI来压缩大型XML文件。 Large表示一个20 GB(二十)的XML文件。

EXI压缩编解码器和非EXI压缩编解码器(gzip / lzma)都集成在Java虚拟机上运行的Scala应用程序中。 GZIP和LZMA由commons-compress提供。所有编解码器都在这些第三方库中用Java实现。

在具有8 GB(JVM为6 GB)的64位Linux系统上,Exificient和OpenExi都可以编码,但无法解码,当原始时XML文件大约是10 GB。

  • 使用OutOfMemory
  • 时出现故障
  • OpenExi因ArrayIndexOutOfBoundsException:1000000
  • 而失败
  • GZIP / LZMA没有问题

  • Oracle JDK:1.8-8u40

  • JVM args:-Xmx6g -XX:+UseG1GC -XX:+UseStringDeduplication

  • 生成的EXI编码的XML文件大小约为70 MB

我的问题:

  • EXI是否暗示(由于它的基础算法)内存使用量随着XML输入文件大小的增加而增加?如果是这样,是否有一个简单的公式来计算所需的内存?
  • 有没有什么可以使它工作(除了分配更多的内存)?

1 个答案:

答案 0 :(得分:1)

EXI格式提供"选项"限制内存使用。

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

valueMaxLengthvaluePartitionCapacity限制EXI字符串表中的条目长度和数量。

例如,将valueMaxLength设置为16表示如果大于16,则不会向表中添加字符串。字符串表在处理时可能会增长,需要保留在内存中直到结束。

选项valuePartitionCapacity限制表格中的字符串数量(循环方式)。

使用EXI压缩时,请考虑减少blockSize

希望这有帮助,

- 丹尼尔