Excel POI 3.5 WorkBook Java堆空间exception?

我正在使用最新的POI 3.5读取Excel。 我已经安装了Excel MS Office 2007,并为此poi提供了执行数据的XSSF。

对于15000行数据,它正在正确执行,但是当超出限制直到30000或100000或200000时,它很容易出现Java堆空间exception。

代码如下:

UATinput = new FileInputStream(UATFilePath); uatBufferedInputStream = new BufferedInputStream(UATinput); UATworkbook = new XSSFWorkbook(uatBufferedInputStream); 

我在Java堆大小的最后一行中得到exception。 我已经使用-Xms256m -Xmx1536m增加了大小,但是仍然为更多的数据提供了Java堆空间exception。

任何人都可以帮我解决这个XSSFWorbookexception吗?

而不是阅读内存中的整个文件尝试使用eventusermodel api

这是一种读取大文件的高效内存方式。 它的工作原理是SAXparsing器(与DOM相反),就是说当遇到特定的数据结构时,它会调用callback方法。 它可能会有点棘手,因为它期望你知道底层数据的实质

在这里你可以find关于这个主题的好教程

希望这可以帮助!

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

如果您使用XSSFWorkbook,POI必须创build一个包含您的整个Excel文件的内存模型,从而消耗巨大的内存。 也许你可以使用不像用户API那么简单的Event API ,但是可以降低内存消耗。

顺便说一下,你也可以为-Xmx设置一个更大的值。

在你自己的代码中另外要注意的是你有多less对象是“新”的。 如果在通过单元格读取时创build大量对象,则可能会耗尽堆。 确保你正在小心你创build的对象的数量。

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

有一点可以做一个小小的改动,那就是不要把你的文件包装在inputstream中! XSSF将高兴地接受一个文件作为input,这是一个比InputStream更低的内存占用。 这是因为POI需要对内容进行随机访问,而对于inputstream来说,唯一的方法就是将整个内容缓冲到内存中。 通过一个文件,它可以寻找周围。 使用文件而不是InputStream将节省你一点点的文件大小的内存价值。

如果可以的话,你应该通过一个文件。 如果内存紧张,请将您的InputStream写入一个文件并使用它!

试试这个: -Xms256m -Xmx512m

您应该非常期待在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

一些关于parsing和使用SAX-XML项目的基本知识是必需的。

JVM使用固定的可用内存运行。 一旦这个内存超过,你会收到“java.lang.OutOfMemoryError”。 JVM尝试在启动时对可用内存做出明智的select(请参阅Java设置了解详细信息),但可以使用以下设置覆盖缺省值。

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

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

您可以使用SXSSF,构build在XSSF之上的低内存脚本SXSSF API。 “ http://poi.apache.org/spreadsheet/how-to.html#sxssf