当前位置: 首页 > 知识库问答 >
问题:

使用SXSSF写入大excel文件时出现内存不足异常

太叔京
2023-03-14

我用SXSSF写了100万条记录(最坏的情况)。

以下是我编码的方式。我必须将记录写入已经存在的excel模板。此模板在类路径中可用。我将此模板复制到公共位置。使用 XSSFWorkBook 加载此文件。SXSSFWorkbook 使用 XSSFWorkBook 和 window size(-1) 作为参数进行初始化。

当记录计数达到100的倍数时,我将冲洗工作表。

Pseudo Code:
if(count % 100 == 0){
    ((SXSSFSheet)sheet).flush(100); //keeps only 100 rows in memory
}

但是在执行这个过程中,堆内存逐渐增加,最终导致Outofmemory异常。我的机器的最大堆内存大小约为1.5 GB。实际服务器中的堆内存可能很大。但是我担心应用程序有多个线程,它们都会创建大的excel文件

这是预期的行为吗?即。在写入大小~ 100万的记录时,是否有望超越1.5 GB?但是正如POI doc中所给出的,SXSSF不应该在将行刷新到磁盘时耗尽内存。

共有1个答案

章远航
2023-03-14

此问题现已:)解决。它与SXSSFWorkbook无关。报表中的一列(表示报表中的错误)需要为红色。因此,我将样式应用于该列。我没有在FOR循环之外创建样式并将其应用于列下的所有单元格,而是在每次写入错误时创建一个样式。在100万条记录中,如果1/2 10万条有错误,我的代码会生成1/2 100万个CellStyles。那正在吞噬我的记忆。

以下链接帮助我解决了这个问题。http://poi.apache.org/faq.html#faq-N100EF

 类似资料:
  • 问题内容: 我有一个1.2 GB的json文件,当反序列化时,应该给我一个包含15百万个对象的列表。 我要反序列化的计算机是具有16核心和32 GB Ram的Windows 2012服务器(64位)。 该应用程序已针对x64构建。 尽管有这种情况,当我尝试读取json文档并将其转换为我遇到内存不足异常的对象列表时。当我查看任务管理器时,我发现仅使用了5GB内存。 我尝试的代码如下。 一个。 b。

  • 我试图使用javax.crypto下的类和用于输入/输出的文件流来实现一个加密/解密程序。为了限制内存使用,我使用-xmx256m参数运行。 它可以很好地对较小的文件进行加密和解密。但是当解密一个巨大的文件(1G大小)时,会出现内存不足的异常: 编辑2: 通过更多的测试,它可以处理的最大文件大小约为堆大小的1/4。比如,如果设置-xmx256m,大于64m的文件将无法解密。

  • 我有一个.xlsx文件,其中包含多个包含不同数据的工作表。在所有的工作表中,一个工作表需要容纳接近100,000行数据,并且需要使用带有POI的Java来写入数据。 对于SXSSFWorkbook,这似乎相当快速和简单,在这里我只能在内存中保留100行,但缺点是我只能写入一个新文件(或覆盖现有文件)。 此外,我不允许‘加载’一个现有的文件,即 null null 我可以使用工作簿工厂: null

  • 我从记忆中得到消息。我是Android的初学者,我不知道原因。我如何解决这个问题?下面是日志: 1.424 4944-4944/com.bsp.AndroidTraining E/ART:抛出OutOfMemoryError“在OOM之前无法分配带有12个空闲字节和12B的162字节分配”(递归情况)06-10 02:03:51.454 494-4944/com.bsp.androidTraini

  • 我正在使用POI()的流式工作表编写一个大型Excel表(超过一百万条记录),但我得到的是。下面是我的代码:

  • 问题内容: 我正在使用IBM Websphere Application Server v6和Java 1.4,并试图将CSV大文件写入以便用户下载。目前文件大小为50-750MB。 较小的文件并不会引起太大的问题,但是对于较大的文件,似乎是将其写入堆中,这随后导致OutOfMemory错误并导致整个服务器停机。 这些文件只能通过HTTPS提供给经过身份验证的用户,这就是为什么我通过Servlet