2015-07-02 90 views
0

根據業務功能,我們需要在多線程環境中的不同位置讀取多個Excel文件(包括.xls和.xlsx格式)。每個線程負責讀取文件。爲了測試性能,我們創建了兩個.xls和.xlsx格式的文件集。一個文件集只有20行數據,而其他文件集包含300,000行數據。我們能夠以.xls格式成功讀取兩個文件並將數據加載到表格中。即使對於20行數據.xlsx文件,我們的源代碼也能正常工作。 但是當執行流程開始讀取.xlsx文件時,應用程序服務器會突然終止。當我開始跟蹤下來的問題,我一直 面臨一個奇怪的問題,同時創造XSSFWorkbook instance.Refer下面的代碼片段:創建XSSFWorkbook實例以讀取XSLX文件時出現OutOfMemory問題

OPCPackage opcPackage = OPCPackage.open(FILE); 
System.out.println("Created OPCPackage instance."); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 
System.out.println("Created XSSFWorkbook instance."); 
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook, 1000); 
System.out.println("Created SXSSFWorkbook instance.");[/code] 

輸出

Process XLSX file EXCEL_300K.xlsx start. 
Process XLSX file EXCEL.xlsx start. 
Created OPCPackage instance. 
Created OPCPackage instance. 
Created XSSFWorkbook instance. 
Created SXSSFWorkbook instance. 
Process XLSX file EXCEL.xlsx end. 

對於較大的文件集執行掛起在 XSSFWorkbook工作簿=新的XSSFWorkbook(opcPackage); 導致堆空間問題。請幫我解決這個問題。

在此先感謝。

謝謝,

Sankar。

+0

這可能是導致無限循環的庫中的錯誤(無論你做什麼都會以OOME結束),或者內存只是簡單的。您是否嘗試增加內存,或者您是否監控了內存消耗的增長? – Marged

+0

1.我正在使用Apache POI -3.10庫進行上述實現。 –

+0

偉大的信息。關於記憶的問題呢?如何更新到3.12,在3.10和3.12之間有很多修復http://poi.apache.org/changes.html? – Marged

回答

0

嘗試了很多解決方案後,我發現處理XLSX文件需要大量內存。但是使用POI 3.12庫有很多優點。

  1. 處理excel文件的速度更快。
  2. 有更多的API來處理Excel文件如關閉一個工作簿,使用文件例如打開一個excel文件等
0

我的Excel包含50個000行和100列,使用POI 3.17閱讀XLSX文件,但stil我得到OOM異常,有人建議我最好的方式來閱讀xlsx。

Code Snippet : 
    OPCPackage pkg = OPCPackage.open(new File("sample.xlsx")); 
    XSSFWorkbook workbook = new XSSFWorkbook(pkg); 

Exception trace: 

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3044) 
    at org.apache.xmlbeans.impl.store.Locale.loadNode(Locale.java:1439) 
    at org.apache.xmlbeans.impl.store.Locale.loadNodeChildren(Locale.java:1402) 
    at org.apache.xmlbeans.impl.store.Locale.loadNode(Locale.java:1444) 
    at org.apache.xmlbeans.impl.store.Locale.loadNodeChildren(Locale.java:1402) 
    at org.apache.xmlbeans.impl.store.Locale.loadNode(Locale.java:1444) 
    at org.apache.xmlbeans.impl.store.Locale.loadNodeChildren(Locale.java:1402) 
    at org.apache.xmlbeans.impl.store.Locale.loadNode(Locale.java:1444) 
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1384) 
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1369) 
    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:370) 
    at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:164) 
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument$Factory.parse(Unknown Source) 
    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:226) 
    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:218) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.parseSheet(XSSFWorkbook.java:443) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:408) 
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:169) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:270) 
    at com.jda.nextgen.test.TestImportExcel.main(TestImportExcel.java:14)