我正在使用SXSSF编写1百万(最坏情况)的记录。
以下是我编码的方式。 我必须将记录写入现有的excel模板。这个 模板是 在类路径中可用。我将此模板复制到一个常见的模板 地点。使用XSSFWorkBook加载此文件。 SXSSFWorkbook使用XSSFWorkBook初始化,窗口大小(-1)为 参数。
当记录数达到100的倍数时,我将冲洗表格。
Pseudo Code:
if(count % 100 == 0){
((SXSSFSheet)sheet).flush(100); //keeps only 100 rows in memory
}
但是在执行此操作时,堆内存逐渐增加并结束 在Outofmemory例外。我的机器的最大堆内存大小是 大约1.5 GB。堆内存在实际服务器中可能很大。但我很担心,因为应用程序有多个线程,他们都创建了大的excel文件。
这是预期的行为吗?即。预计它会超过1.5 GB 写大小〜1百万的记录?但正如在POI文档中给出的那样,SXSSF不会因为将行刷新到磁盘而耗尽内存。
答案 0 :(得分:0)
现在已经解决了:)。 它与SXSSFWorkbook无关。 报告中的一个特定列(表示报告中的错误)需要为红色。所以我将Style应用到该列。 而不是在FOR循环外创建Style并将其应用于列下的所有单元格,我每次写错误时都会创建一个样式。 在100万条记录中,如果有一百五十万条记录有错误,我的代码就产生了一百万个CellStyles。那就是吃掉我的堆内存。
以下链接帮助我解决了这个问题。 http://poi.apache.org/faq.html#faq-N100EF