当前位置: 首页 > 知识库问答 >
问题:

Apache POI XSSF的堆空间错误

拓拔弘厚
2023-03-14

我正在尝试使用Apache POI XSSF库解析一个大型excel文件(.xlsx)。100000行之后,它抛出堆空间错误。我试着增加记忆,但没用。是否有解决此问题的方法?或者有人可以建议我另一个库来解析大型excel文件。

谢啦!

共有3个答案

金晗日
2023-03-14

当面对最常见的OutOfMemoryError时,即“java.lang.OutOfMemoryError:java堆空间”,必须首先了解一些简单的方面。

Java应用程序允许使用有限的内存。此限制在应用程序启动期间指定。为了使事情更加复杂,Java内存被划分为不同的区域,称为heap space和permgen。

这些区域的大小是在Java虚拟机(JVM)启动期间通过指定-Xmx和-XX:MaxPermSize等参数来设置的。如果未明确设置大小,将使用特定于平台的默认值。

因此–当您尝试向堆空间区域添加更多数据时,会触发“[java.lang.OutOfMemoryError:java heap space][1]”错误,但空间不足。

根据这个简单的描述,您有两个选择

  • 给数据结构更多的空间
  • 减少使用的数据结构的大小

提供更多空间很容易-只需通过更改-Xmx参数来增加堆大小,类似于下面的示例为Java进程提供1G堆:

java -Xmx1024m com.mycompany.MyClass

减少数据结构的大小通常需要更多的努力,但为了消除潜在的问题,这可能是必要的——提供更多的空间有时只会掩盖症状,推迟不可避免的情况。例如,当面临内存泄漏时,您只是推迟了所有内存都被泄漏垃圾填满的时间。

在您的情况下,可以选择以较小的批次读取数据,并在此时处理每个批次。

濮献
2023-03-14

尝试最新版本(稳定!)Apache POI版本。

替代品可能是智能XLS

文建业
2023-03-14

你可以用http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api

请查看此线程以了解详细信息。

使用Apache POI从excel文件中搜索记录的有效方法

 类似资料:
  • 在Ubuntu中,当我运行hadoop示例时: 在日志中,我得到的错误为: 信息映射。JobClient:任务Id:尝试\u 201303251213\u 0012\u m\u000000 \u 2,状态:失败错误:Java堆空间13/03/25 15:03:43信息映射。JobClient:任务Id:trunt\u 201303251213\u 0012\u m\00000 1\u 2,状态:F

  • 我在向服务器调用API时出错。以下是日志: 附截图:Java内存使用率系统CPU使用率 我还需要知道这句话的意思: HikariPool-1-检测到线程饥饿或时钟跳跃(管家delta=50s527ms107µs731ns)。 有人能帮我解释一下这个错误吗?

  • 我正在尝试使用scala执行小计算。Im使用datastax-4.6。我有6个节点,每个16gb RAM和8核。当我尝试执行scala程序时,它会显示以下错误。 错误ActorSystemImpl:线程[sparkDriver-akka.actor.default-dispatcher-17]关闭ActorSystem[sparkDriver]java时出现未捕获的致命错误。lang.OutOfM

  • 我正在Android Studio中开发一个Android应用程序,今天当我按下“运行”按钮时,它突然无法编译。错误如下: 错误:任务': app: pack ageInstantRunResourcesDebug'执行失败。Java堆空间 我试着清理并重建这个项目,但没有成功。

  • 问题内容: 我最近在具有24个CPU和32GB RAM的服务器上使用了带有Ipython的PySpark。它仅在一台机器上运行。在我的过程中,我想收集以下代码中给出的大量数据: 当我做 它给我outOfMemory错误。。另外,此错误发生后,我无法在Spark上执行任何操作,因为它失去了与Java的连接。它给。 看起来堆空间很小。如何设置更大的限制? 编辑 : 我在运行之前尝试过的事情: 我根据此

  • 问题内容: 我在执行多线程程序时遇到以下错误 上面的错误发生在其中一个线程中。 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时分配了实例变量的空间。 有什么办法可以增加堆空间? 我应该对程序进行哪些更改,以使其占用更少的堆空间? 问题答案: 如果要增加堆空间,可以 -在命令行上使用。默认情况下,这些值基于JRE版本和系统配置。你可以在Ja