我正在使用Java Apache POI庫並處理巨大的Excel表。大約10 mb的數據有很多行和列。一個excel文件中也有8-10張不同的紙張。數據不是富文本格式,而是充滿內部函數和公式,例如。 = SUM(A2:A4)
等等,我對此沒有任何顧慮。錯誤:XSSFWorkbook中超出了GC開銷限制
此圖片僅用於圖解目的。在實際的數據功能的方式不同的和非常複雜的:
的數據包括字符串,數字和布爾值。我關心的只是將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我試圖分配更多的內存,但它仍然不工作了。下面是我試圖分配更多內存的快照。
如果我做錯事的內存分配,讓我知道。我會做必要的改變。
新的編輯
通過在Eclipse加入-Xmx8192m
我跑的配置在下面centic評論中提及我已經解決了我的問題。我現在正在通過使用SXSSFWorkbook
尋找其他解決內存問題的方法,正如下面的答案中所討論的那樣。
可能重複[GC溢出限制超過Apache POI](http://stackoverflow.com/questions/33368612/gc-overhead-limit-exceeded-with-apache-poi) – huellif
@huellif我試着分配更多的內存,但它不起作用。我也編輯了我的問題。 – Dhruvify
您顯示的內存設置適用於Eclipse IDE和Java Webstart,您是如何啓動應用程序的?如果在Eclipse中作爲應用程序或單元測試,那麼您需要調整運行配置中的內存設置,而不是在您自己的代碼運行時實際應用它們。 – centic