Excel POI 3.5工作簿Java堆空间异常?
我正在使用最新的POI 3.5进行Excel阅读。我安装了Excel MS office 2007,为此poi提供了XSSF以执行数据 对于15000行数据,它可以正常执行,但是当超过限制直到30000、100000或200000时,它很容易出现Java堆空间异常 代码如下:Excel POI 3.5工作簿Java堆空间异常?,java,excel,heap,apache-poi,Java,Excel,Heap,Apache Poi,我正在使用最新的POI 3.5进行Excel阅读。我安装了Excel MS office 2007,为此poi提供了XSSF以执行数据 对于15000行数据,它可以正常执行,但是当超过限制直到30000、100000或200000时,它很容易出现Java堆空间异常 代码如下: UATinput = new FileInputStream(UATFilePath); uatBufferedInputStream = new BufferedInputStream(UATinput); UATw
UATinput = new FileInputStream(UATFilePath);
uatBufferedInputStream = new BufferedInputStream(UATinput);
UATworkbook = new XSSFWorkbook(uatBufferedInputStream);
我在最后一行得到了Java堆大小的异常。
我已经使用-Xms256m-Xmx1536m
增加了大小,但对于更多数据,它仍然给出了Java堆空间异常
有人能帮我解决XSSFWorbook的这个异常吗?试试这个:
-Xms256m-Xmx512m
如果使用XSSFWorkbook,POI必须创建一个包含整个Excel文件的内存模型,因此会消耗大量内存。也许您可以使用,它不像用户API那么简单,但允许更低的内存消耗
顺便说一句,您还可以为-Xmx…设置一个更大的值,而不是在内存中读取整个文件,请尝试使用api 这是一种读取大型文件的非常节省内存的方法。它的工作原理是SAX解析器(与DOM相反),即当遇到特定的数据结构时,它将调用回调方法。它可能会变得有点棘手,因为它希望您了解底层数据的本质 你可以找到关于这个主题的好教程
希望这有帮助 在您自己的代码中要注意的另一件事是有多少对象是“新”的。如果在读取单元格时创建了大量对象,也可能会耗尽堆。确保对创建的对象的数量非常小心 伙计们,在使用UserEventModel之后,我的表现非常出色。如果你们有任何问题,请写信给我。djeakandane@gmail.com正如其他人所说,最好的办法是切换 不过,有一件事会有一点不同,那就是不要将文件包装到输入流中!XSSF很乐意接受一个文件作为输入,这比InputStream占用的内存更少。这是因为POI需要对内容进行随机访问,而使用输入流的唯一方法是将整个内容缓冲到内存中。有了文件,它就可以四处搜索。使用文件而不是输入流将为您节省略多于文件大小的内存
如果可以,您应该传递一个文件。如果内存紧张,将InputStream写入文件并使用它 您应该非常期待在XLSX技术背后处理XML数据网格。您将从堆空间问题中解放出来。 以下是教程: 检查下面的两个链接
需要一些解析和使用SAX-XML项目的基本知识。JVM使用固定的可用内存运行。一旦超过此内存,您将收到“java.lang.OutOfMemoryError”。JVM尝试在启动时对可用内存进行智能选择(有关详细信息,请参阅Java设置),但您可以使用以下设置覆盖默认设置 要提高性能,可以在JVM中使用某些参数。 Xms1024m-将JVM的最小可用内存设置为1024 MB Xmx1800m-将JVM的最大可用内存设置为1800 MB。Java应用程序无法使用比通过此参数定义的更多堆内存
如果您从命令行启动Java程序,请使用以下设置:Java-Xmx1024m YourProgram。您可以使用SXSSF,这是一种构建在XSSF之上的低内存占用SXSSF API。“”您不能将最大堆大小(-Xmx)设置为低于起始堆大小(-Xms)-您是否键入了错误?SXSSF是只写的:SXSSF是与API兼容的XSSF流式扩展,在必须生成非常大的电子表格且堆空间有限时使用。