我目前正在评估 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 输入文件的大小而增加?如果是这样,是否有一个简单的公式来计算所需的内存?
- 有什么办法可以让它工作(除了分配更多的内存)?