gpt4 book ai didi

java - POI XSSF 是否仍然存在疯狂的错误内存问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:56 26 4
gpt4 key购买 nike

几年前,我遇到了使用 jXLSPOI XSSF 创建大型 excel 文件的问题。如果我没记错的话,我认为 XSSF 会在磁盘上创建类似 1GB+ 的临时文件来创建 10mb 的 excel 文件。所以我停止使用 jXLS 而是使用 SXSSF 来创建 excel 文件,但今天我有了使用 jXLSJETT 的新理由

jXLSJETT 网站似乎都暗示性能要好得多,但是 POIXSSF网站仍然笼统地说 XSSF 需要更高的内存占用。我想知道现在这种更高的内存占用是否相当于合理的 10% 开销,或者它是否仍然像几年前那样的 10,000% 开销。

POI 3.9 XSSF 是否修复了疯狂的内存问题?我是否应该担心将它与 jXLSJETT 一起使用?或者是否有某些陷阱需要避免?我对重复使用单元格样式很谨慎。

最佳答案

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

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

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

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

  1. 用于生成 header 和格式的标准 JETT XLSX 模板。第一张表的最后一行包含带有 $$tokens$$ 的单元格,每个单元格一个。我不使用 JETT 插入大量行。

  2. JETT 完成工作后,我重新打开工作簿,阅读然后删除第一个电子表格最后一行的 $$tokens$$,并开始使用 SXSSF 逐行传输数据。

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

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

关于java - POI XSSF 是否仍然存在疯狂的错误内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21488738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com