【发布时间】: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-size 和javarevisited.blogspot.in/2011/05/…
-
@Mena 非常有帮助.. 感谢您的详细解释
标签: java excel apache-poi out-of-memory heap-memory