poi解析excel内存溢出

 真是悲剧啊,一个破内部使用系统20多个人使用的后台管理系统有个excel文件上传功能,使用poi3.6版本来解析excel,出现的case是20多个人同时在上传,平均每个人上传的excel有1000多行,大小也就是不到100k吧,由于每个excel后端处理服务时间较长,导致同时需要处理100k*20的excel的行数,本来也就几M的数据量,可是poi解析居然要用掉的内存是这个量的几百倍,不可思议,

使用代码如下:

   

Java代码 
  1. XSSFWorkbook wb = new XSSFWorkbook(inputStream);  
  2.          XSSFSheet sheet = wb.getSheetAt(0);  
  3.          Iterator<Row> iter = sheet.iterator();  
  4.          boolean isfirstline = true;  
  5.          while (iter.hasNext()) {  
  6.              Row row = iter.next();  
  7.              if (isfirstline) { // 忽略上传文件第一行的标题栏  
  8.                  isfirstline = false;  
  9.                  continue;  
  10.              }  
  11.               //解析excel,每行有11列,然后对每列解析出来之后调用后端服务把数据保存到数据库中,  
  12.              }  
  13.          }  

 

 内存当时监控,重启一次马上又挂了,

  

 

 

在本地测试了下:

  用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最好分批上传;

转载于:https://www.cnblogs.com/zhwj184/archive/2013/03/20/3027426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值