当前位置: 首页 > 面试题库 >

EXcel Sheet POI验证:内存不足错误

汪和悌
2023-03-14
问题内容

我正在尝试使用java验证excel文件,然后再将其转储到数据库中。

这是导致错误的代码段。

try {
        fis = new FileInputStream(file);
        wb = new XSSFWorkbook(fis);
        XSSFSheet sh = wb.getSheet("Sheet1");
        for(int i = 0 ; i < 44 ; i++){
            XSSFCell a1 = sh.getRow(1).getCell(i);
            printXSSFCellType(a1);
        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这是我得到的错误

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.ArrayList.<init>(Unknown Source)
    at java.util.ArrayList.<init>(Unknown Source)
    at org.apache.xmlbeans.impl.values.NamespaceContext$NamespaceContextStack.<init>(NamespaceContext.java:78)
    at org.apache.xmlbeans.impl.values.NamespaceContext$NamespaceContextStack.<init>(NamespaceContext.java:75)
    at org.apache.xmlbeans.impl.values.NamespaceContext.getNamespaceContextStack(NamespaceContext.java:98)
    at org.apache.xmlbeans.impl.values.NamespaceContext.push(NamespaceContext.java:106)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.check_dated(XmlObjectBase.java:1273)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.stringValue(XmlObjectBase.java:1484)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.getStringValue(XmlObjectBase.java:1492)
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTCellImpl.getR(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFCell.<init>(XSSFCell.java:105)
    at org.apache.poi.xssf.usermodel.XSSFRow.<init>(XSSFRow.java:70)
    at org.apache.poi.xssf.usermodel.XSSFSheet.initRows(XSSFSheet.java:179)
    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:143)
    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:130)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:286)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:207)
    at com.xls.validate.ExcelValidator.main(ExcelValidator.java:79)

当xlsx文件小于1 MB时,这可以很好地工作。

我了解这是因为我的xlsx文件约为5-10 MB,POI尝试一次将整个工作表加载到JVM内存中

有什么可能的解决方法?

请帮忙。

提前致谢!


问题答案:

您有两种选择。选项1-增加JVM
Heap的大小,以便Java有更多的可用内存。使用UserModel代码在POI中处理Excel文件是基于DOM的,因此整个文件(包括已解析的表单)需要缓冲到内存中。尝试这样的问题,以获取有关如何增加帮助的建议。

选项#2的工作量更大-
切换到基于事件(SAX)的处理。这一次只处理文件的一部分,因此需要少得多的内存。但是,这需要您做更多的工作,这就是为什么您最好将更多的GB内存扔给这个问题-
内存便宜,而程序员却没有!该电子表格HOWTO页有关于如何做的的.xlsx文件的SAX解析说明,并有通过POI提供的各种示例文件,你可以看看的意见。

另外,另一件事-
您似乎正在通过流加载文件,这很糟糕,因为这意味着更多内容需要缓冲到内存中。有关更多信息,请参阅POI文档,包括有关如何直接使用文件的说明。



 类似资料:
  • 问题内容: 我是Netbeans中这种错误的新手。我一直在使用Java Bean 8.0.2在Java J2SE中工作。我正在对字符串进行模糊搜索,通常字符串长度为300-500。我正在使用Levenshtein和Jaro Winkler算法来查找字符串之间的距离。大约有1500次迭代来查找字符串之间的距离!问题是我的Net Bean通常会为以下内容提供错误: 我已经在线进行了一些搜索来摆脱此错误

  • 上周,我们在生产环境中遇到了内存不足的错误。这种内存不足的错误可能每周发生一次,当前的解决方案是重新启动应用程序服务器。我们使用的是glassfish 3.0.1。生成的堆转储约为5GB。 请帮助分析下面的堆转储。下面是使用eclipse MAT生成的泄漏嫌疑人报告。我们如何分析下面的报告?

  • 问题内容: 我正在尝试运行ant任务,但是出现以下错误: 我尝试使用谷歌搜索来查找如何设置此值,但找不到。我努力了 我努力了 但我仍然遇到同样的例外。我尝试将值成功增加到1024m 更新资料 我解决了 它与很少的内存无关。在我的javadoc一代中,这是一个无休止的循环。 问题答案: 我解决了 它与很少的内存无关。在我的javadoc一代中,这是一个无休止的循环。 为ant设置更多内存的正确方法是

  • 我的spark程序在小数据集上运行良好。(大约400GB)但是当我将其扩展到大型数据集时。我开始得到错误

  • 我正在努力解决古老的字谜问题。多亏了许多教程,我能够迭代一组字符串,递归地找到所有的排列,然后将它们与英语单词列表进行比较。我发现的问题是,在大约三个单词之后(通常是关于“变形”之类的东西),我会得到一个OutOfMemory错误。我试着把我的批分成小的集合,因为它似乎是消耗我所有内存的递归部分。但即使只是“变形”也把它锁起来了... 编辑:根据出色的反馈,我已经将生成器从排列更改为工作查找: 它

  • 问题内容: 我尝试按照此http://hadoop.apache.org/common/docs/stable/single_node_setup.html文档安装Hadoop 。当我尝试执行此 我收到以下异常 请提出一个解决方案,以便我可以尝试该示例。整个异常在下面列出。我是Hadoop的新手,我可能做过一些愚蠢的事情。任何建议将不胜感激。 问题答案: 您可以通过编辑conf / mapred-