java.lang.OutOfMemoryError:加载xlsx文件时超出了GC开销限制

java.lang.OutOfMemoryError:加载xlsx文件时超出了GC开销限制,java,garbage-collection,out-of-memory,apache-poi,xssf,Java,Garbage Collection,Out Of Memory,Apache Poi,Xssf,我理解这个错误的意思,我的程序消耗了太多内存,并且在很长一段时间内无法恢复 当内存出现问题时,我的程序正在读取6,2Mb xlsx文件 当我试图监视程序时,它的内存消耗很快达到1.2Gb,然后崩溃。当读取6,2Mb文件时,它如何达到1,2Gb 有没有办法将文件分块打开?这样就不必加载到内存中了?还是其他解决方案 正是这部分原因。但既然它是一个图书馆,它不应该被巧妙地处理吗?它只有20万行,只有3列。对于未来,我需要它与约1百万记录和更多的列 代码: 如果希望处理大型XLSX文件,则需要使用流式X

我理解这个错误的意思,我的程序消耗了太多内存,并且在很长一段时间内无法恢复

当内存出现问题时,我的程序正在读取6,2Mb xlsx文件

当我试图监视程序时,它的内存消耗很快达到1.2Gb,然后崩溃。当读取6,2Mb文件时,它如何达到1,2Gb

有没有办法将文件分块打开?这样就不必加载到内存中了?还是其他解决方案

正是这部分原因。但既然它是一个图书馆,它不应该被巧妙地处理吗?它只有20万行,只有3列。对于未来,我需要它与约1百万记录和更多的列

代码:


如果希望处理大型XLSX文件,则需要使用流式XSSFReader类。因为数据是XML,所以可以使用StAX有效地处理内容

下面是一种从xlsx获取Inputstream的方法

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();
    }
}
单元的元素为,和。您可以创建一个小的xlsx文件,解压缩它并检查其中的XML以获取更多信息

编辑:
有一些关于使用SAX处理数据的方法,但使用StAX更好,效率也同样高。

如果希望处理大型XLSX文件,则需要使用流式XSSFReader类。因为数据是XML,所以可以使用StAX有效地处理内容

下面是一种从xlsx获取Inputstream的方法

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();
    }
}
单元的元素为,和。您可以创建一个小的xlsx文件,解压缩它并检查其中的XML以获取更多信息

编辑:

有一些关于使用SAX处理数据的方法,但使用StAX更好,效率也同样高。

您给程序提供了多少内存?Excel文件中有多少行?这是一种可怕的格式,当您有足够的行时,即使是实际的Excel应用程序也很容易阻塞。这个库无法超越文件格式的愚蠢。听起来像一个巨大的Excel文件。这不像是加载6.2MB的纯文本数据。它大约有200k行,但我需要它处理大约1mil的数据。行…Excel从来没有打算用于这些大小。你的项目要求不周全,我会无视Kayaman的建议。我试图听从这个建议,但似乎是错的。特别是因为数据是XML,所以可以使用StAX有效地处理内容。我首先假设微软会将所有数据放在一个文件中,有点像CSV文件中发生的事情,但是相反,微软给了我们一个文件,其中的值指向另一个包含字符串的文件。如何匹配它们?这就是Apache类的用途。一个人如何扫描一个文件,在另一个文件中找到一些东西,而不将一个文件的全部存储在内存中?你给程序多少内存?Excel文件中有多少行?这是一种可怕的格式,当您有足够的行时,即使是实际的Excel应用程序也很容易阻塞。这个库无法超越文件格式的愚蠢。听起来像一个巨大的Excel文件。这不像是加载6.2MB的纯文本数据。它大约有200k行,但我需要它处理大约1mil的数据。行…Excel从来没有打算用于这些大小。你的项目要求不周全,我会无视Kayaman的建议。我试图听从这个建议,但似乎是错的。特别是因为数据是XML,所以可以使用StAX有效地处理内容。我首先假设微软会将所有数据放在一个文件中,有点像CSV文件中发生的事情,但是相反,微软给了我们一个文件,其中的值指向另一个包含字符串的文件。如何匹配它们?这就是Apache类的用途。一个人如何扫描一个文件在另一个文件中找到一些东西,而不将一个文件的所有内容都保存在内存中?谢谢。所以当我得到InputStream时,我需要从中创建我自己的xlsx块?我的意思是,在那之后我该如何处理sheetStream?我有文件中的数据吗?我从来没有读过带有输入流的xlsx文件,所以我不知道会发生什么。好吧,所以我得到了XML,我只是不理解解压的部分。。。但好吧,这只是我缺乏知识。谢谢你的回答。我怎么知道XLSX是一个zip文件?所有非平面文件都是拉链吗?我的意思是所有非平面文件都是拉链吗?谢谢。所以当我得到InputStream时,我需要从中创建我自己的xlsx块?我的意思是,在那之后我该如何处理sheetStream?我有文件中的数据吗?我从来没有读过带有输入流的xlsx文件,所以我不知道会发生什么。好吧,所以我得到了XML,我只是不理解解压的部分。。。但好吧,这只是我缺乏知识。谢谢你的回答。我怎么知道XLSX是一个zip文件?所有的非平面文件都是拉链吗?我是说所有的非平面文件都是拉链吗?。