错误:XSSFWorkbook中超出了GC开销限制
我正在与Java的Apache POI库和处理巨大的Excel表。 大约10 mb的数据有很多行和列。 一个excel文件中也有8-10张不同的纸张。 数据不是富文本格式,但充满了内部函数和公式,例如。 = SUM(A2:A4)
等等,我对此没有任何顾虑。
此图片仅用于说明目的。 实际数据中的函数是不同的和非常复杂的:
数据包括string,数字和布尔值。 我关心的只是将XSSF读取值作为普通文本排除在Excel中应用的所有公式或函数。 所以说,在上面的图像中,我只想读取行和列中的值,例如ie 10,20,30 etc, Numbers, Total
问题
如果我格式化Excel工作表并删除所有的公式和函数,并以简单的富文本格式保存数据,我的代码运行。 但是,当我不修改excel文件并保持上述格式所示的数据时,我遇到GC开销超限错误。
我想要的是
我只想读取完整的公式和函数的excel文件。 当我删除所有的公式,并保留工作表中的文本作为正常的富文本格式时,我的algorithm工作。
我试过了
正如其他资源在线和在计算器中所提到的,我尝试了第一种方法,如下面的代码所示:
fis = new FileInputStream(path); opc = OPCPackage.open(fis); XSSFWorkbook workbook = new XSSFWorkbook(opc);
我不是简单地使用FileInputStream
进行input,而是首先通过OPCPackage传递它。 它仍然显示相同的错误和代码不会执行下面的XSSFWorkbook workbook
然后我用XSSFReader
使用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
,如果我使用XSSFWorkbook
,它会抛出GC开销限制超出的错误。 所以目前我手动删除所有的公式和函数,然后algorithm的作品,但它不是有效的方式来处理这个问题。 任何帮助或build议表示赞赏。
编辑:
正如在这里指出的链接,我试图分配更多的内存,但它仍然没有工作。 下面是我试图分配更多内存的快照。
如果我在分配内存方面做错了,请告诉我。 我会做必要的改变。
新build编辑
我已经通过在eclipse中的运行configuration中添加了-Xmx8192m
来解决我在下面的centic注释中提到的问题。 我现在正在寻找解决内存问题的其他方法,使用SXSSFWorkbook
已经在下面的答案中讨论过。
发表评论为答案:
您所显示的内存设置是针对Eclipse IDE和Java Webstart的,您是如何启动应用程序的? 如果在Eclipse中作为应用程序或unit testing,那么您需要调整运行configuration中的内存设置,而不是在您自己的代码运行时实际应用它们。
你有没有尝试打开该文件作为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 。 从他们的JavaDoc直接采取:“这允许写入非常大的文件,而不会耗尽内存,因为任何时候只有可configuration的行部分保存在内存中”