错误: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的行部分保存在内存中”