簡體   English   中英

java.lang.OutOfMemoryError:加載xlsx文件時,超出了GC開銷限制

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM