poi多线程操作问题(OOM与操作createCell报错ConcurrentModificationException)

前言

在公司项目“北森开放平台”API的对接上,需要将8w多条数据导出到Excel中,

原先单线程访问5000条数据需要20多分钟;

后面利用线程池开启多线程访问API接口来获取信息,6分钟搞定,大概效率提高了5倍,但是!!!

  • 同时导出8w多数据,发现在导出5w多的时候OOM了,原因:数据量太大,造成sheet对象过大,堆空间直接OOM;

    解决方案:

    • 减少不必要的字段
    • 多文件打包(每5000个数据导出做一个文件)
    • 多sheet(先生成excel 写了一个sheet后,重新再去写这个excel,也就是写到5000数据时,写入excel,然后释放内存,再去写这个excel)
  • 发现部分线程会在createCell时报错“ConcurrentModificationException”

    原因:

    cell底层的TreeMap结构,即每行的cells是以TreeMap存储的

    在createCell时

    public XSSFCell createCell(int columnIndex, CellType type) {
         
        Integer colI = new Integer(columnIndex);
        XSSFCell prev = (XSSFCell)this._cells.get(colI);
        CTCell ctCell;
        if (prev != null) {
         
            ctCell = prev.getCTCell();
            ctCell.set(Factory.newInstance());
        } else {
         
            ctCell = this._row.addNewC();
        }
    
        XSSFCell xcell = new XSSFCell(this, ctCell);
        xcell.setCellNum(columnIndex);
        if (type != CellType.BLANK) {
         
            xcell.setCellType(type);
        }
    
        this._cells.put(colI, xcell);
        return xcell;
    }
    

    先get在put,多线程在Treemap的操作中会出现 遍历修改的问题,即(fail-fast&#x

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值