【问题标题】:Java Apache POIJava Apache POI
【发布时间】:2015-09-20 01:21:04
【问题描述】:

我正在从一个 Excel 文档中读取数据,该文档每两周更新一次,包含大约 50,000 行数据,在开始新工作表之前可能会达到大约 120,000 行。我正在使用 Apache POI 来获取数据。我在下面得到了这个例外,但我相信最重要的一个例外是 引起:java.lang.OutOfMemoryError:Java 堆空间。我已经在另一个数据较少的 Excel 表上测试了我的代码,并且能够读取数据。

如果您对如何阅读大型excel文档有任何方法或建议,请分享。

org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
    at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:456)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:162)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:271)
    at excelreader.readExcelFile(excelreader.java:28)
    at excelreader.main(excelreader.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60)
    ... 13 more
Caused by: java.lang.OutOfMemoryError: Java heap space
    at org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:260)
    at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2995)
    at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3207)
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportStartTag(Piccolo.java:1082)
    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1822)
    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521)
    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362)
    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4678)
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290)
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400)
    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714)
    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3454)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1276)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1263)
    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheRecords$Factory.parse(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFPivotCacheRecords.readFrom(XSSFPivotCacheRecords.java:62)
    at org.apache.poi.xssf.usermodel.XSSFPivotCacheRecords.<init>(XSSFPivotCacheRecords.java:53)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:456)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461)
    at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:162)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:271)
    at excelreader.readExcelFile(excelreader.java:28)
    at excelreader.main(excelreader.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

【问题讨论】:

  • 嗯...您是否尝试过提高分配的最大堆?
  • 是的,我使用的是 32 位 Java。我将它提高到 512M,但仍然遇到同样的异常。
  • 您可以在 32 位上设置最大为 4GB。再调整一点?
  • @Mena 我认为这个问题是因为内存泄漏,如果它不能使用 1GB 的堆大小,所以我认为仅仅增加堆大小不会有太大帮助,因为......azulsystems.com/technology/java-heap-sizejavarevisited.blogspot.in/2011/05/…
  • @Mena 非常有帮助.. 感谢您的详细解释

标签: java excel apache-poi out-of-memory heap-memory


【解决方案1】:

1 .在java中解决OutOfMemoryError的简单方法是使用JVM选项"-Xmx512M"增加最大堆大小,这将立即解决您的OutOfMemoryError。

Java 虚拟机 (JVM) 以固定的内存上限运行,您可以这样修改:

-Xms<size> - Set initial Java heap size
-Xmx<size> - Set maximum Java heap size

$ java -Xms512m -Xmx1024m JavaApp

2.在 Java 中解决 OutOfMemoryError 的第二种方法相当困难,并且当您没有太多内存并且即使在增加最大堆大小之后您仍然收到 java.lang.OutOfMemoryError 时出现,在这种情况下您可能想要分析您的应用程序并查找任何内存泄漏。

因此,要检查内存泄漏,您可以使用一些工具。没有它非常困难。一些流行的是:

Jmap 是 JDK6 附带的命令行实用程序,允许您在文件中进行堆的内存转储。它很容易使用,如下所示:

jmap -dump:format=b,file=heapdump 6054

Eclipse memory analyzer (MAT)
是一个来自eclipse基础的分析java堆转储的工具。它有助于发现类加载器泄漏和内存泄漏,并有助于最大限度地减少内存消耗。您可以使用 MAT 分析承载数百万个对象的堆转储,它还可以帮助您提取内存泄漏的嫌疑。

【讨论】:

  • 谢谢你,准备试试这些。
【解决方案2】:

它确实与堆大小有关。我将它设置为 2g,但仍然内存不足。我正在使用的 excel 文档位于数据透视表中,Apache POI 对此有限制。导致第一个异常

【讨论】:

  • 尝试优化工作,例如及时使用引用并在对象对您无用时立即取消对象
【解决方案3】:

试试java.exe -Xmx512m -jar yourjar.jar

它将最大堆大小设置为 512 MB。或者如果 512 不够,请尝试更大的值。

【讨论】:

  • 我之前增加了空间,还是同样的错误。感谢您的意见。
  • @talex:感谢编辑。 (at)Allee:进展如何?该应用程序运行时间是否更长,或者它甚至会以某种方式影响?尝试使用 java 64 位并设置 -Xmx2048m。这会改变什么吗?
  • @AlleeClark 50.000 行将使用大量内存。尝试设置最大值(对于 32 位版本的 java,它介于 1.5 和 2 GB 之间)
  • 它以相同的速度编译。我相信这是因为我正在从数据透视表中阅读。我尝试了 2 GB,但仍然收到相同的异常。
  • 好的,所以我会 - 进一步了解 - 减少数据大小。在那之后,您可能能够估计什么是可能的。什么不是。也许你必须选择另一种策略继续前进......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2014-11-21
相关资源
最近更新 更多