Excel POI 3.5 WorkBook Java堆空间异常?

问题描述:

我正在使用最新的POI 3.5读取Excel。我安装了Excel MS Office 2007,并且为此poi提供了用于执行数据的XSSF。Excel POI 3.5 WorkBook Java堆空间异常?

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

代码如下:

UATinput = new FileInputStream(UATFilePath); 

uatBufferedInputStream = new BufferedInputStream(UATinput); 

UATworkbook = new XSSFWorkbook(uatBufferedInputStream); 

我正在为Java堆大小的最后一行例外。 我已经使用-Xms256m -Xmx1536m增加了大小,但仍然为更多的数据提供Java堆空间异常。

任何人都可以帮我解决这个XSSFWorbook异常吗?

+0

您无法将最大堆大小(-Xmx)设置为小于起始堆大小(-Xms) - 您是否犯了拼写错误? – 2010-01-29 03:08:56

不必读取内存中的整个文件尝试使用eventusermodel API

这是阅读一个非常有效的记忆方法大文件。它的工作原理是SAX解析器(与DOM相反),因为它会在遇到特定数据结构时调用回调方法。因为它希望你知道底层数据

Here的基本事实,你可以找到关于此主题

希望这有助于一个很好的教程,它可能会有点棘手!

试试这个:-Xms256m -Xmx512m

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

通过你也可以设置-Xmx更大价值的方式...

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

其真正的家伙,使用UserEventModel后,我的表现非常棒。如果你们有任何问题,请写信给我。 [email protected]

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

一两件事,会让小的差异,虽然是不换你的文件输入流! XSSF会高兴地接受一个File作为输入,这比InputStream的内存占用更少。这是因为POI需要对内容进行随机访问,并且对于输入流来说,唯一的方法就是将整个内容缓冲到内存中。通过一个文件,它可以寻找周围。使用文件而不是InputStream将节省您的文件大小的内存价值。

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

您应该真的期待在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项目是必需的。

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

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

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

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

+0

SXSSF是只写的:SXSSF是XSSF的API兼容流式扩展,用于制作非常大的电子表格时,并且堆空间有限。 – 2014-04-16 08:05:04