前言
在公司项目“北森开放平台”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