![](/img/trans.png)
[英]Loading big HashMap<String, TreeMap> from file gives java.lang.OutOfMemoryError(GC overhead limit exceeded)
[英]java.lang.OutOfMemoryError: GC overhead limit exceeded when loading an xlsx file
我理解該錯誤是什么意思,即我的程序占用了太多內存,並且很長一段時間都無法恢復。
發生內存問題時,我的程序僅讀取6,2Mb xlsx
文件。
當我嘗試監視該程序時,它很快就會達到1,2Gb的內存消耗,然后崩潰。 讀取6,2Mb文件時如何達到1,2Gb?
有沒有一種方法可以分塊打開文件? 這樣就不必將其加載到內存中了嗎? 或其他解決方案?
正是這部分導致了它。 但是由於它是一個庫,難道不應該以某種方式巧妙地處理它嗎? 它只有20萬行,只有3列。 為了將來,我需要它與大約。 100萬條記錄和更多列...
碼:
Workbook myWorkBook;
Sheet mySheet;
if (filePath.contains(".xlsx")) {
// Finds the workbook instance for XLSX file
myWorkBook = new XSSFWorkbook(fis);
// Return first sheet from the XLSX workbook
mySheet = myWorkBook.getSheetAt(0);
myWorkBook.close(); // Should I close myWorkBook before I get data from it?
}
如果希望使用大型XLSX文件,則需要使用流XSSFReader
類。 由於數據是XML,因此可以使用StAX有效地處理內容。
這里是(單程)如何獲得Inputstream
從XLSX。
OPCPackage opc = OPCPackage.open(file);
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)) { // Or you can keep track of sheet numbers
in = sheetStream;
return;
} else {
sheetStream.close();
}
}
元素是<row>
和<c>
(用於單元格)。 您可以創建一個小的xlsx文件,將其解壓縮並檢查其中的XML以獲取更多信息。
編輯:有一些使用SAX處理數據的示例 ,但是使用StAX更好而且同樣有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.