poi解析excel内存溢出
来源:互联网 发布:数据库视图和表的区别 编辑:程序博客网 时间:2024/05/17 02:00
真是悲剧啊,一个破内部使用系统20多个人使用的后台管理系统有个excel文件上传功能,使用poi3.6版本来解析excel,出现的case是20多个人同时在上传,平均每个人上传的excel有1000多行,大小也就是不到100k吧,由于每个excel后端处理服务时间较长,导致同时需要处理100k*20的excel的行数,本来也就几M的数据量,可是poi解析居然要用掉的内存是这个量的几百倍,不可思议,
使用代码如下:
- XSSFWorkbook wb = new XSSFWorkbook(inputStream);
- XSSFSheet sheet = wb.getSheetAt(0);
- Iterator<Row> iter = sheet.iterator();
- boolean isfirstline = true;
- while (iter.hasNext()) {
- Row row = iter.next();
- if (isfirstline) { // 忽略上传文件第一行的标题栏
- isfirstline = false;
- continue;
- }
- //解析excel,每行有11列,然后对每列解析出来之后调用后端服务把数据保存到数据库中,
- }
- }
内存当时监控,重启一次马上又挂了,
在本地测试了下:
用4.5M多的14多w条记录的excel上传后,然后调试dump jvm heap信息,可怕的poi解析过程使用的两个类的内存占用量惊人的大
网上查了下,大概有几种解决方法:
1. 这个不知道哪个版本才有,3.6是没有的
官方DEMO中有个
Workbook wb = new SXSSFWorkbook(1000);
// keep 1000 rows in memory,
// exceeding rows will be
// flushed to disk
内存里一次只留 多少行
2.尽量使用csv或者txt格式的文件;
3.如果确实必须使用excel,以前有人在传统软件里面是用.net的com组件去调用office的API,这种性能应该是最优的,然后在.net里面提供服务异步解析excel文件;
4.最好能把用户上传的excel先保存起来,然后用一个异步线程一个一个处理excel,这样就不会同时处理好几个excel的量导致内存暴涨,然后excel最好分批上传;
- poi解析excel内存溢出
- 解决POI解析excel出现内存溢出问题
- poi导出excel内存溢出解决办法
- POI 解决写入excel内存溢出
- POI解决读入Excel内存溢出
- Apache POI组件读取Excel文档内存溢出
- 解决POI读取Excel内存溢出的问题
- JAVA关于POI导出Excel内存溢出的解决方案
- 解决POI读取Excel内存溢出的问题
- 解决POI导出Excel文件内存溢出问题
- POI生成excel数据量大时内存溢出解决
- 解决POI读取Excel内存溢出的问题
- [转]Poi读取Excel引发的内存溢出
- 解决POI读取Excel内存溢出的问题
- 解决POI大数据导出Excel内存溢出、应用假死
- 解决POI读取Excel内存溢出的问题
- POI 内存溢出解决方案
- POI 内存溢出解决方案
- org.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException
- 两分钟学会在GitHub托管代码
- //@JSON(serialize=false) //@JSON(serialize=false)打开来加载 否则会报alert(data)错误JSONExceprion
- 1_JAVA概述
- 黑马程序员-多态
- poi解析excel内存溢出
- Oracle带输入、输出参数的存储过程 返回受影响的行数 SQL%ROWCOUNT
- Android输入法挤乱布局问题
- Hibernate的核心类和接口
- Vmware虚拟机与VirtualBox虚拟机的硬盘镜像相互转换
- 多线程同步机制的几种方法
- 交换两个变量
- MultiByteToWideChar和WideCharToMultiByte用法详解
- ASIHttpRequest☞上传文件