2015-08-13 85 views
0

我想讀取一個大小爲50Mb的excel,並通過poi在java中包含各種表格,但問題是當我嘗試創建對象時,我在下面發佈的堆棧跟蹤的例外情況。對於出存儲器空間錯誤的我已經配置此用Apache POI打開電子表格時內存不足

-Xmx1024m -Duser.timezone=GMT0 already 
下面

是其中我試圖讀取的excel拳頭,然後將其convrting成字節數組稍後將它作爲bytr流,其中i檢測它的快照擴展,它是的.xlsx類型的,因此momnet我嘗試創造我得到了下面的異常請告知如何從這個

 String fileName = "C:\\abc\\xret.xlsx"; 


FileInputStream fis = new FileInputStream(fileName); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
       byte[] bFile = new byte[(int) fileName.length()]; 
       byte[] buf = new byte[1024]; 
       try { 
        for (int readNum; (readNum = fis.read(buf)) != -1;) { 
         bos.write(buf, 0, readNum); 
        } 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
       byte[] bytes = bos.toByteArray(); 
       processExcelObjects(bytes); 

後來下面我正在進一步創建對象如下圖所示

克服對象
 byteArrayInputStream = new ByteArrayInputStream(bytes); 

     if (byteArrayInputStream.available() != -1) 
       { 
        if (filename.lastIndexOf("."))).equalsIgnoreCase(".xlsx")) 
         { 

        XSSFWorkbook workbookXlsx = new XSSFWorkbook(); 
         //**** got the exception ********//      
        workbookXlsx = new XSSFWorkbook(byteArrayInputStream); // ****** on this line I got the exception *********// 

       } 

,我在創建上述workbookXlsx對象

    org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException 
      at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62) 
      Caused by: java.lang.OutOfMemoryError: Java heap space 
      at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3039) 
      at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3060) 
      Caused by: java.lang.reflect.InvocationTargetException 
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 

請指教是POI內部異常或堆空間一個

+1

可能不是一個答案,但肯定是一個很好的開始[OutOfMemoryError:Java堆空間](http://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java -heap-space-error-64mb-heap?rq = 1) – Prudhvi

+1

內存不足。 – bmargulies

+0

我正在運行此參數-Xmx1024m -Duser.timezone = GMT0已經 –

回答

1

不是一個POI內部異常有異常,你沒用完的記憶。

你可以試着加大對-Xmx2048m以上,但考慮了不同的方法,像在發表的意見建議@sibnick:

Processing large xlsx file in Java

0

該異常意味着你的Java沒有足夠的內存分配爲了運行這個。

可以在命令行上使用java -Xms -Xmx。

如果您運行使用Eclipse的應用程序,

項目上點擊右鍵 - >運行方式 - >運行配置..->選擇參數選項卡 - >在VM參數可以增加你的JVM的內存分配

請參閱本文檔詳細瞭解vmoptions oracle - vmoptions

0

我認爲有一些你應該使用內存分配的問題

for (int readNum; (readNum = fis.read(bFile)) != -1;) { 
         bos.write(bFile, 0, readNum); 
} 

將buf變量替換爲bFile變量並檢查它。