Excel POI 3.5 WorkBook Java堆空间异常?

时间:2010-01-29 03:06:21

标签: java excel heap apache-poi

我正在使用最新的POI 3.5 for Excel阅读。我安装了Excel MS Office 2007,因为poi正在提供XSSF来执行数据。

对于15000行数据,它正在正常执行,但是当超过30000或100000或200000的限制时,它容易出现Java堆空间异常。

代码如下:

UATinput = new FileInputStream(UATFilePath);

uatBufferedInputStream = new BufferedInputStream(UATinput);

UATworkbook = new XSSFWorkbook(uatBufferedInputStream);

我在Java堆大小的最后一行得到了Exception。 我使用-Xms256m -Xmx1536m增加了大小,但是对于更多数据,它给出了Java堆空间异常。

有人可以帮我解决XSSFWorbook的这个例外吗?

9 个答案:

答案 0 :(得分:6)

请尝试使用eventusermodel api

,而不是在内存中读取整个文件

这是一种读取大文件的内存效率非常高的方法。它的工作原理是SAX解析器(而不是DOM),因为它会在遇到特定数据结构时调用回调方法。它可能会有点棘手,因为它希望你知道底层数据的细节

Here你可以找到关于这个主题的好教程

希望这有帮助!

答案 1 :(得分:1)

真正的家伙,在使用UserEventModel后,我的表现真棒。如果你们有任何问题,请写信给我。 djeakandane@gmail.com

答案 2 :(得分:0)

试试这个:-Xms256m -Xmx512m

答案 3 :(得分:0)

如果您使用XSSFWorkbook,POI必须创建包含整个Excel文件的内存模型,因此会占用大量内存。也许你可以使用Event API,它不像用户API那么简单但允许更低的内存消耗。

顺便说一句,您还可以为-Xmx ...

设置更大的值

答案 4 :(得分:0)

在您自己的代码中要注意的另一件事是您有多少对象“新”。如果在读取单元格时创建了大量对象,它也可能会耗尽堆。确保您要小心创建的对象数量。

答案 5 :(得分:0)

正如其他人所说,最好的办法是切换Event API

但有一点不同的是,不要将文件包装在输入流中! XSSF很乐意接受File作为输入,这比InputStream的内存占用更少。这是因为POI需要随机访问内容,并且使用输入流,唯一的方法是将整个内容缓冲到内存中。使用文件,它可以只是寻找。使用File而不是InputStream可以节省一些超过内存文件大小的内容。

如果可以,您应该传递一个文件。如果内存紧张,请将InputStream写入文件并使用它!

答案 6 :(得分:0)

您应该真正期待处理XLSX技术背后的XML数据网格。您将从堆空间问题中解放出来。 这是教程: 检查下面的两个链接。

http://poi.apache.org/spreadsheet/how-to.html

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/examples/FromHowTo.java

需要一些解析和使用SAX-XML项目的基本知识。

答案 7 :(得分:0)

JVM以固定的可用内存运行。一旦这个内存超过,你将收到“java.lang.OutOfMemoryError”。 JVM尝试在启动时对可用内存进行智能选择(有关详细信息,请参阅Java设置),但您可以使用以下设置覆盖默认值。

要提高性能,您可以使用JVM中的某些参数。 Xms1024m - 将JVM的最小可用内存设置为1024兆字节 Xmx1800m - 将JVM的最大可用内存设置为1800兆字节。 Java应用程序不能使用通过此参数定义的更多堆内存。

如果从命令行启动Java程序,请使用以下设置:java -Xmx1024m YourProgram。

答案 8 :(得分:0)

您可以使用SXSSF,一种基于XSSF构建的低内存占用SXSSF API。 “http://poi.apache.org/spreadsheet/how-to.html#sxssf