0

我目前正在评估 EXI 以压缩大型 XML 文件。大是指 20 GB(二十)的 XML 文件。

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

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

  • Exificient 因 OutOfMemory 而失败
  • OpenExi 失败并出现 ArrayIndexOutOfBoundsException: 1000000
  • GZIP/LZMA 没有问题

  • 甲骨文 JDK:1.8-8u40

  • JVM参数:-Xmx6g -XX:+UseG1GC -XX:+UseStringDeduplication

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

我的问题:

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

1 回答 1

1

EXI 格式提供“选项”来限制内存使用。

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

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

例如设置valueMaxLength 为 16 意味着如果大于 16 则不向表中添加字符串。字符串表在处理过程中可能会增长,需要保存在内存中直到最后。

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

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

希望这可以帮助,

——丹尼尔

于 2017-07-24T14:20:23.420 回答