4

我正在使用最新的 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 的例外情况吗?

4

9 回答 9

6

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

这是读取大文件的一种非常节省内存的方法。它的工作原理是 SAX 解析器(与 DOM 相对),因为它会在遇到特定数据结构时调用回调方法。它可能会有点棘手,因为它希望您了解基础数据的本质

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

希望这可以帮助!

于 2010-01-29T07:21:52.607 回答
1

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

于 2010-10-14T08:05:03.413 回答
0

试试这个:-Xms256m -Xmx512m

于 2010-01-29T03:24:10.220 回答
0

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

顺便说一句,您还可以为 -Xmx 设置更大的值...

于 2010-01-29T06:57:42.603 回答
0

在您自己的代码中要注意的另一件事是您“新建”了多少对象。如果您在读取单元格时创建了很多对象,那么它也可能会耗尽堆。确保您小心创建的对象数量。

于 2010-02-08T05:16:50.863 回答
0

正如其他人所说,您最好的选择是切换事件 API

不过,有一点会有所不同的是,不要将文件包装在输入流中!XSSF 很乐意接受 File 作为输入,这比 InputStream 占用更少的内存。这是因为 POI 需要随机访问内容,而使用输入流的唯一方法是将整个内容缓冲到内存中。使用文件,它可以四处寻找。使用 File 而不是 InputStream 将为您节省超过文件大小的内存。

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

于 2011-07-16T12:06:01.860 回答
0

您真的应该期待处理 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 项目的使用。

于 2012-09-13T21:25:37.330 回答
0

JVM 使用固定的可用内存运行。一旦超出此内存,您将收到“java.lang.OutOfMemoryError”。JVM 尝试在启动时对可用内存做出明智的选择(有关详细信息,请参阅 Java 设置),但您可以使用以下设置覆盖默认设置。

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

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

于 2013-01-24T13:09:52.767 回答
0

您可以使用 SXSSF,这是一种基于 XSSF 构建的低内存占用 SXSSF API。“ http://poi.apache.org/spreadsheet/how-to.html#sxssf

于 2013-09-30T09:03:12.743 回答