Advertisement

POI库中的多线程操作报错(OOM和ConcurrentModificationException)

阅读量:

前言

为了实现"北森开放平台"API集成的目的,在项目对接过程中,需将8万条数据导入到Excel文件中.

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

通过多核处理机制启动多个子进程以同步调用网络服务以获取所需数据仅需6分钟即可完成该操作处理速度提升了约50%

进行了批量输出8万条数据的操作后发现,在将输出量提升至5万条时出现OOM错误。具体原因在于处理的数据量过大,导致工作表对象占用内存过多,并最终引起堆栈内存溢出。

解决方案:

  • 去除不必要的字段信息
  • 分批次打包处理(将数据按照每5,000个记录分组打包导出)
  • 多工作表(先生成Excel文档并创建一个工作表;完成后释放内存资源;再次打开Excel文档并重复上述操作直到完成所有数据处理)

在某些情况下会发现某些线程实例会在调用createCell方法时触发报错异常

原因:

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

在createCell时

复制代码
    public XSSFCell createCell(int columnIndex, CellType type) {

    Integer colI = new Integer(columnIndex);
    XSSFCell prev = (XSSFCell)this._cells.get(

全部评论 (0)

还没有任何评论哟~