我正在使用最新的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的这个例外吗?
答案 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
需要一些解析和使用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”