首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POI仍然存在严重的内存问题吗?

POI仍然存在严重的内存问题吗?
EN

Stack Overflow用户
提问于 2014-01-31 19:46:16
回答 1查看 8.1K关注 0票数 10

几年前,我遇到了使用jXLSPOI XSSF创建大型excel文件的问题。如果我的内存是正确的,我认为XSSF会在磁盘上创建类似于1GB+临时文件的东西来创建10 memory文件。因此,我不再使用jXLS,而是使用SXSSF创建excel文件,但今天我有了使用jXLSJETT的新理由。

jXLSJETT的网站似乎都暗示,性能要好得多,但POIXSSF网站仍然笼统地表示,XSSF需要更高的内存占用。我想知道,这种较高的内存占用是否相当于目前的10%开销,还是与几年前的10,000%的开销一样。

POI3.9 XSSF是否修复了严重的内存问题?我不应该担心与jXLSJETT一起使用它吗?还是有一定的问题要避免?我非常小心地重复使用单元格样式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-12 09:33:15

要回答您的问题,是的,POI在处理大型XLSX文件时总是使用非常大的内存,这比XLSX文件的大小要大得多。我认为这种情况不会很快改变,这是很明显的原因: XLSX基本上是一堆压缩的XML文件,而且XML很好地压缩(大约10倍)。将这个XML放在未压缩的内存中将增加10倍的内存消耗,因此如果您添加了所有数据结构的开销,您就不可能期望比XLSX文件大小增加10%的内存消耗。

现在,好消息是,正如注释中提到的,Apache引入了SXSSF,用于在电子表格中传输大量数据,具有非常好的性能和较低的内存使用率。以这种方式生成的XLSX文件仍然流在硬盘上,最终会占用相当大的空间,但至少在编写几十万行时不会冒OOME的风险。

问题是您无法让JETT直接使用SXSSF,因为它需要加载到内存中的整个文档来执行模板填充。杰特的作者很快讨论了这个话题,here

我也遇到了同样的问题,最后做了一个两步的XLSX创建:

  1. 一个标准的JETT XLSX模板,用于生成标题和格式。第一个工作表的最后一行包含带有$$tokens$$的单元格,每个单元格一个。我没有用杰特来插入这么多行。
  2. 一旦杰特完成了它的工作,我就重新打开工作簿,阅读,然后删除第一个电子表格最后一行的$$tokens$$,然后逐行使用SXSSF开始流数据。

当然,这种方法也有局限性:-在插入行期间,不能在任何流行上使用JETT (但可以在插入之前,动态地选择$$tokens$$的顺序)--除非您自己使用POI来处理,否则不会复制单元格格式。我个人更喜欢格式化XLSX文件中的整个列,它将应用于流数据。

如果您想使用SXSSF插入的数据显示图表,也可以使用函数偏移和COUNTA定义一个命名的范围,然后创建一个数据透视表&数据透视图,当在Excel中打开XLSX时,它将被刷新。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21488738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档