Java 阿帕奇兴趣点

Java Apache POI

我正在从一个 excel 文档中读取数据,该文档每两周更新一次,包含大约 50,000 行数据,并且在开始新的 [=21= 之前可能会达到大约 120,000 行].我正在使用 Apache POI 获取数据。我在下面得到这个例外,但我相信最重要的一个例外是 原因:java.lang.OutOfMemoryError:Java堆space。我已经在数据较少的不同 excel sheet 上测试了我的代码,并且能够读取数据。

如果您有任何阅读大型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)

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

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

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.Second 解决 Java 中的 OutOfMemoryError 的方法相当困难,当你没有太多内存时就会出现,即使在增加最大堆大小后你仍然会得到 java.lang.OutOfMemoryError,在这种情况下,您可能想要分析您的应用程序并查找任何内存泄漏。

所以要检查内存泄漏你可以使用一些 tools.Its 没有它很难。一些受欢迎的是:

Jmap 是 JDK6 附带的命令行实用程序,允许您在文件中获取堆的内存转储。使用起来很简单,如下所示:

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

Eclipse memory analyzer (MAT)
是 eclipse 基金会的一个工具,用于分析 java 堆转储。它有助于发现类加载器泄漏和内存泄漏,并有助于最小化内存 consumption.you 可以使用 MAT 分析携带数百万对象的堆转储,它还可以帮助您提取内存泄漏的嫌疑。

它确实与堆大小有关。我将它设置为 2g,但仍然出现内存不足错误。我正在使用的 excel 文档位于一个枢轴 table 中,Apache POI 对此有限制。这导致第一个异常