Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel POI 3.5工作簿Java堆空间异常?_Java_Excel_Heap_Apache Poi - Fatal编程技术网

Excel POI 3.5工作簿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

我正在使用最新的POI 3.5进行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堆大小的异常。 我已经使用
-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流式扩展,在必须生成非常大的电子表格且堆空间有限时使用。