【发布时间】:2014-11-21 22:16:13
【问题描述】:
我正在尝试使用 Apache POI XSSF 库解析一个大型 excel 文件 (.xlsx)。在 100,000 行之后,它会引发堆空间错误。我尝试增加内存,但没有帮助。有解决此问题的方法吗?或者有人可以建议我使用另一个库来解析大型 excel 文件。
谢谢!
【问题讨论】:
标签: java out-of-memory apache-poi
我正在尝试使用 Apache POI XSSF 库解析一个大型 excel 文件 (.xlsx)。在 100,000 行之后,它会引发堆空间错误。我尝试增加内存,但没有帮助。有解决此问题的方法吗?或者有人可以建议我使用另一个库来解析大型 excel 文件。
谢谢!
【问题讨论】:
标签: java out-of-memory apache-poi
尝试 Apache POI 的最新(稳定!)版本。
替代品可能是smartXLS
【讨论】:
面对最常见的OutOfMemoryError,即“java.lang.OutOfMemoryError: Java heap space”,首先要了解一些简单的方面。
Java 应用程序可以使用有限的内存量。此限制在应用程序启动期间指定。为了让事情变得更复杂,Java 内存被分隔为不同的区域,称为堆空间和 permgen。
这些区域的大小是在 Java 虚拟机 (JVM) 启动期间通过指定参数设置的,例如 -Xmx 和 -XX:MaxPermSize。如果您没有明确设置大小,将使用特定于平台的默认值。
所以 – 当您尝试向堆空间区域添加更多数据但没有足够空间时,将触发“[java.lang.OutOfMemoryError: Java heap space][1]”错误。
根据这个简单的描述,你有两个选择
提供更多空间很容易 - 只需通过更改 -Xmx 参数来增加堆大小,类似于以下示例,为您的 Java 进程提供 1G 的堆可供使用:
java -Xmx1024m com.mycompany.MyClass
减少数据结构的大小通常需要更多的努力,但这可能是为了摆脱潜在问题所必需的 - 提供更多空间有时只会掩盖症状并推迟不可避免的问题。例如,当面临内存泄漏时,您只是推迟了所有内存都被泄漏垃圾填满的时间。
在您的情况下,以较小的批次读取数据并同时处理每个批次可能是一种选择。
【讨论】: