[alibaba/easyexcel]读取100W条记录的Excel出现OOM(1.1.2-beta4版本)

2024-06-20 303 views
9

初步分析了一下,大概是因为POI底层OPCPackage.open方法有多个重载,easyExcel中使用的是OPCPackage open(InputStream in);跟读后发现有如下代码: byte[] buffer = new byte[4096]; int read = 0; while( (read = inp.read(buffer)) != -1 ) { baos.write(buffer, 0, read); } 判断应该是由于这个问题导致OOM,修改为使用OPCPackage open(File file)或OPCPackage open(String path)可以正常解析。

附上异常信息: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:191) at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.(ZipInputStreamZipEntrySource.java:136) at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.(ZipInputStreamZipEntrySource.java:56) at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:100) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324) at com.alibaba.excel.analysis.v07.XlsxSaxAnalyser.(XlsxSaxAnalyser.java:44) at com.alibaba.excel.analysis.ExcelAnalyserImpl.getSaxAnalyser(ExcelAnalyserImpl.java:47) at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:72) at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyserImpl.java:67) at com.alibaba.excel.ExcelReader.read(ExcelReader.java:112) at easyExcel.ExcelReaderTest.main(ExcelReaderTest.java:25)

回答

4

希望可以解决这个大文件读取的问题

3

能够将这个OPCPackage open(File file) 方法提供成外部可以传递参数的API就好了,也遇到类似的问题

0

遇到类似一样的问题。现在这个问题有没有解决?

5

可以使用1.0.2版本以避免该问题

6

这个已经在最新版本修复,请使用最新版本。https://maven-badges.herokuapp.com/maven-central/com.alibaba/easyexcel。并且参照:https://github.com/alibaba/easyexcel/blob/master/quickstart.md 去书写

@zhuangjiaju 你好,导入文件大小60m,设置了ZipSecureFile.setMinInflateRatio(0);,可以正常解析并获取到数据,但是在程序运行一段时间后,报以下错误

Zip bomb detected! .....
at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.advance(ZipSecureFile.java:245)

这块有什么好的解决办法吗?