2017-04-20 487 views
1

我正在使用Java Apache POI庫並處理巨大的Excel表。大約10 mb的數據有很多行和列。一個excel文件中也有8-10張不同的紙張。數據不是富文本格式,而是充滿內部函數和公式,例如。 = SUM(A2:A4)等等,我對此沒有任何顧慮。錯誤:XSSFWorkbook中超出了GC開銷限制

此圖片僅用於圖解目的。在實際的數據功能的方式不同的和非常複雜的:

enter image description here

的數據包括字符串,數字和布爾值。我關心的只是將XSSF讀取值作爲普通文本排除在Excel中應用的所有公式或函數。這麼說來,在上圖中我只是想讀行值和列i.e. 10,20,30 etc, Numbers, Total

問題

如果我格式的Excel表,並刪除所有公式和函數以及簡單的富文本格式保存數據,我代碼運行。但是,當我不修改Excel文件並保持上述格式所示的數據時,我會遇到GC開銷超限錯誤。

我想

我只是想閱讀完整的公式和函數,就像他們的Excel文件的內容。我的算法在我刪除所有公式並將工作表中的文本保存爲正常的富文本格式時起作用。

我試過

正如在其他在線資源中提到和計算器,我想下面的代碼給出第一個辦法:

fis = new FileInputStream(path); 
opc = OPCPackage.open(fis); 
XSSFWorkbook workbook = new XSSFWorkbook(opc); 

而不是簡單地使用FileInputStream輸入我第一次通過它通過OPCPackage。仍然顯示相同的錯誤和代碼將不會執行XSSFWorkbook workbook

然後,我用第二種方法與XSSFReader。下面是代碼:

xssfReader = new XSSFReader(opc); 
    SharedStringsTable sst = xssfReader.getSharedStringsTable(); 
    XSSFReader.SheetIterator itr = (XSSFReader.SheetIterator)xssfReader.getSheetsData();     

    while(itr.hasNext()) { 
      InputStream sheetStream = itr.next(); 
      if(itr.getSheetName().equals(sheetName)) { 

       // no idea how to extract sheet like I would do in XSSFWorkbook 
       // I only get Sheet name of desired sheet 

    } // while ends here 

沒什麼至今對我的作品,如果我用XSSFWorkbook,它會拋出GC開銷超過限制的錯誤。所以目前我手動刪除所有的公式和函數,然後算法工作,但它沒有有效的方法來處理這個問題。任何幫助或建議表示讚賞。

編輯:

正如指出的鏈接here我試圖分配更多的內存,但它仍然不工作了。下面是我試圖分配更多內存的快照。

enter image description here enter image description here

如果我做錯事的內存分配,讓我知道。我會做必要的改變。

新的編輯

通過在Eclipse加入-Xmx8192m我跑的配置在下面centic評論中提及我已經解決了我的問題。我現在正在通過使用SXSSFWorkbook尋找其他解決內存問題的方法,正如下面的答案中所討論的那樣。

+0

可能重複[GC溢出限制超過Apache POI](http://stackoverflow.com/questions/33368612/gc-overhead-limit-exceeded-with-apache-poi) – huellif

+0

@huellif我試着分配更多的內存,但它不起作用。我也編輯了我的問題。 – Dhruvify

+2

您顯示的內存設置適用於Eclipse IDE和Java Webstart,您是如何啓動應用程序的?如果在Eclipse中作爲應用程序或單元測試,那麼您需要調整運行配置中的內存設置,而不是在您自己的代碼運行時實際應用它們。 – centic

回答

1

發表評論:

的您顯示的內存設置適用於Eclipse IDE和Java Webstart,您是如何啓動應用程序的?如果在Eclipse中作爲應用程序或單元測試,那麼您需要調整運行配置中的內存設置,而不是在您自己的代碼運行時實際應用它們。

+0

這已經解決了我的問題。我在eclipse中爲我的運行配置添加了-Xmx8192m'。謝謝。 – Dhruvify

0

您是否曾嘗試以SXSSF工作簿而不是XSSF工作簿打開文件?

fis = new FileInputStream(path); 
opc = OPCPackage.open(fis); 
XSSFWorkbook workbook = new XSSFWorkbook(opc); 
SXSSFWorkbook wb = new SXSSFWorkbook(workbook); 

請參閱https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html。採取directy從他們的JavaDoc:「這讓寫的非常大的文件,而在任何一個時間運行內存,因爲只有行的配置部分保存在內存」作爲答案

+0

是的,我嘗試了這一點,但是我的代碼在'XSSFWorkbook工作簿=新的XSSFWorkbook(opc);'代碼後引發GC限制超出異常。我只是不明白爲什麼它是這樣的。當我從Excel文件中刪除公式時,我沒有任何問題。我有大量的數據。 – Dhruvify

+0

嗯。這是否工作? FileInputStream fis = new FileInputStream(excelFile); \t \t Workbook workBook = new SXSSFWorkbook(200); \t \t workBook = WorkbookFactory.create(fis); – tomgeraghty3

+0

我現在試過了,並且在'workBook = WorkbookFactory.create(fis);'後得到同樣的錯誤;' – Dhruvify

相關問題