java 读取excel2007 内存不足_原创 |我是如何解决POI解析Excel出现的OOM问题的?
背景
之前接手过一个解析Excel的项目,使用的是Java里的POI组件解析的,但是在解析时候经常出现OOM,后来我从下面几个方面优化了下,解决了99%的问题,对,你没看错,只解决了99%。
解决方案
1.调整JVM的堆内存
我们知道几乎所有的java对象实例都存放在Java堆中,出现OOM肯定是堆内存不够用了,所有先调大堆内存。
下面命令把JVM启动后堆的初始内存和最大内存调整为4g:
java -Xms4g -Xmx4g
2.限制Excel大小
数据多占用内存就大,在观察了一段时间后发现有的excel是有图片或者有几十个sheet页,而真正需要解析的数据可能就几百行,所以直接在上传时候限制了Excel文件的大小。
3.修改POI源码
上面两个方案后虽然出现OOM的频率低了,但是还是会有,后来找了几个报OOM的Excel跟踪POI源码,发现好多空行POI都创建了对象,直接修改成 空行不处理就好了。
项目中使用的POI版本是3.17,修改的是XSSFSheet.java的initRows()方法,改后的代码如下,其实只加了三行代码(包含大括号):
private void initRows(CTWorksheet worksheetParam) {
_rows.clear();
tables = new TreeMap();
sharedFormulas = new HashMap();
arrayFormulas = new ArrayList();
for (CTRow row : worksheetParam.getSheetData().getRowArray()) {
//修改poi源码 begin
if(row.getCArray().length<=0){
continue;
}
//修改poi源码 end
XSSFRow r = new XSSFRow(row, this);
// Performance optimization: explicit boxing is slightly faster than auto-unboxing, though may use more memory
final Integer rownumI = new Integer(r.getRowNum()); // NOSONAR
_rows.put(rownumI, r);
}
}
上面三个方案如果还不行,可以考虑使用 easyexcel,alibaba开源的,基于注解,可读性好,想了解更多可以参考:
https://github.com/alibaba/easyexcel
推荐阅读
如果觉得文章不错,希望可以随手转发或者”在看“哦,非常感谢哈!
关注下方公众号后回复「1024」,有惊喜哦!
java 读取excel2007 内存不足_原创 |我是如何解决POI解析Excel出现的OOM问题的?相关推荐
- java 读取excel2007 内存不足_内存不足错误 – 写入Excel时的Java堆空间
我有近100,000条记录的数据,我正在尝试使用XSSFWorkbook通过 Java代码将数据写入.xlsx文件.我能够将数据库中的所有数据提取到ArrayList.通过迭代ArryList,我将数 ...
- java 读取excel2007 内存不足_POI处理excel2007内存溢出问题
项目中遇到数据导入.导出用excle操作的问题,数据量在W级别,因03版有6W+的限制,系统统一采用07版excel来做,采用POI进行处理,在导入.导出的时候都遇到的内存溢出的问题,导入方面主要参考 ...
- poi解析excel读取日期为数字的问题
Apache poi 版本:3.12 今天在用poi解析excel文件时,碰到一个蛋疼的问题. 在我的excel文件中有一列是日期类型,例如有以下这么一行数据(日期中月份前面的0会自动去掉): 在读取 ...
- Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法
java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...
- java解析excel报错,poi解析excel文件报错
getFileMagic() only operates on streams which support mark(int) 使用 bis 解决 BufferedInputStream bis = ...
- java读取文件特别慢_如何提高在Java中读取大文件的速度?
我只读了一个大小为167MB且行号为1884000的文件.我使用的方法是BufferedReader,以获得读取它的效果. 我注意到,随着当前行号的增加,读取文件的过程越来越慢(在这种情况下,我花了3 ...
- java C语言内存占用_使用Cgroup限制Java使用的内存量-思路
1. 对一个正在运行着的进程来说,在不到达其内存使用量边界的情况下,扩大/缩小其cgroup分配的内存不会对它产生任何影响. 2. 在进程已经使用了一定量的内存的情况下,缩小其cg ...
- java读取jsp文件内容_使用Java读取Excel文件内容
问题:我能用Java读取一个Excel文件吗?如果能,怎么做? 回答:是的,可以用Java读取Microsoft Excel文件.微软提供了一个Excel的ODBC驱动程序,因此我们就可以使用JDBC ...
- java 堆外内存 查看_超干货!Cassandra Java堆外内存排查经历全记录
背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测.压测时候比较容易触发OOM Killer,把cassandra进程干掉.问题是8G这个规格我配置的heap(Xmx ...
最新文章
- eclipse+MapReduce
- ArchiMate - 发布【企业架构语言ArchiMate v0.5.pdf】
- 前端学习(3109):react-hello-开发者工具
- Axure教程 axure新手入门基础(3) 简单易上手
- netapp脚本保存日志_Shell脚本实战:日志关键字监控+自动告警
- SpringDataRedis的简单案例使用
- java 测试排序_java排序的几种方法 - 善待自己的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 编码器z相 C语言代码,编码器的Z相是什么?
- HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
- C++ 内存分配(new,operator new)详解
- 平衡小车从原理到实践
- 避坑11_VScode在vue文件内template无法使用tab补齐标签
- DirectX11编程11 Blend混合
- macOS制作Linux启动U盘,如何在Mac OS下用ISO包制作启动U盘
- Jlink仿真sw调试方式的4线连接方式
- 【黑金ZYNQ7000系列原创视频教程】01.熟悉vivadomdash;mdash;纯逻辑led实验
- 因计算机丢失d3dx9-30,win10 64位纯净版运行仙剑5提示缺少d3dx9_30.dll的修复方法
- 判断某天是该年中的多少天
- C语言数据结构-第七章图-电大同步进度
- 25 岁做什么,可在 5 年后受益匪浅?