java读取大excel 提前判断_Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案...

本文介绍了在Java中使用POI处理大Excel文件时遇到的内存溢出问题,分析了原因(大量空行数据导致内存占用过高)。提出了使用Excel Streaming Reader工具作为解决方案,该工具通过缓存部分行到内存中实现迭代读取,从而降低内存使用。文章还提供了引入依赖和使用示例代码。
摘要由CSDN通过智能技术生成

注意:此参考解决方案只是针对xlsx格式的excel文件!

背景

前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的dump文件,发现在发生OOM时创建了大量的String对象。最后对照时间点,发现宕机的时候业务人员在上传一个excel文件,但是这个excel文件才28MB大小,感觉应该不会引起内存溢出。后来在本地启动了服务,然后尝试上传这个excel文件,同时使用Java VisualVM监控GC情况,发现在上传的时候,创建了大量的String对象,后来老年代没有可分配空间导致了OOM。最终分析结果是,excel文件中存在几十万的空行数据,表面上看,这些空行数据跟不存在数据的行是一样的,但是POI会把这种空行数据读入到内存中,感觉这也是一个坑。

在网上搜了很长时间,发现国内网站上的解决方案真是没法看,基本上答案都差不多,没有什么有见解性的解决方法,后来在stackoverflow上找到了解决方法。算是给自己做一下备注,也想帮助一些还在坑里的人,就分享一下,只是自己的见解,有不得当的地方也请见谅。

常规读取方法

通常在读取excel文件时(.xlsx),是使用如下代码进行加载的:

FileInputStream fi = new FileInputStream("e:/2.xlsx");

XSSFWorkbook wk= new XSSFWorkbook(fi);

然后再获取对应的Sheet、Row和Cellÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值