当前位置: 首页 > news >正文

easyExcel大数据量导出oom

easyExcel大数据量导出
  • 异常信息
com.alibaba.excel.exception.ExcelGenerateException: java.lang.OutOfMemoryError: GC overhead limit exceededat com.alibaba.excel.write.ExcelBuilderImpl.fill(ExcelBuilderImpl.java:84)at com.alibaba.excel.ExcelWriter.fill(ExcelWriter.java:185)
  • 原因,easyExcel在进行填充数据的时候比较耗内存容易造成oom
  • 解决方案,把数据分批写入文件,部分代码
        ExcelWriter excelWriter = null;ByteArrayOutputStream outputStream = new ByteArrayOutputStream();try {// 创建填充配置FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();excelWriter = EasyExcel.write(outputStream).withTemplate(templateIn).build();// 创建Sheet对象WriteSheet sheet = EasyExcel.writerSheet(0).build();// 分批导出int totalSize = dataList.size();// 每次导入条数int limit = 20000;// 共分的次数int totalPages = totalSize / limit;if (totalPages % limit > 0) {totalPages++;}for (int i = 0; i < totalPages; i++) {if (i == totalPages - 1) {excelWriter.fill(dataList.subList(i * limit, dataList.size()), fillConfig, sheet);} else {excelWriter.fill(dataList.subList(i * limit, limit * (i + 1)), fillConfig, sheet);}}} finally {if (null != excelWriter) {// 关闭流excelWriter.finish();}try {outputStream.close();} catch (IOException e) {log.error("关闭文件流失败");}try {templateIn.close();} catch (IOException e) {log.error("关闭文件流失败");}}
  • 验证:分批次写入文件,可以正常导出文件,并未出现oom
  • 在导出excel数据之后,fullGc的时候并未第一时间回收数据集合,可以在finally手动回收数据对象
finally {if (!CollectionUtils.isEmpty(dataList)) {dataList.clear();}if (null != excelWriter) {// 关闭流excelWriter.finish();}try {outputStream.close();} catch (IOException e) {log.error("关闭文件流失败");}try {templateIn.close();} catch (IOException e) {log.error("关闭文件流失败");}}
  • 在数据行数超过104万条的时候报错
    在这里插入图片描述
  • 1048576是poi的限制
  • 超过104万的话可以采用分sheet页导出的方式
http://www.lryc.cn/news/326086.html

相关文章:

  • react native上传二进制图片、视频的方法
  • JVM之堆
  • R语言实现——网状 Meta 分析
  • Java项目:77 springboot母婴商城
  • 【排序算法】深入解析快速排序(霍尔法三指针法挖坑法优化随机选key中位数法小区间法非递归版本)
  • 生成微信小程序二维码
  • 网络编程(1)写一个简单的UDP网络通信程序【回显服务器】,并且实现一个简单的翻译功能
  • Ansys Speos | Light Expert Group探测器组使用技巧
  • C#学习笔记3:Windows窗口计时器
  • C语言与sqlite3入门
  • Rancher(v2.6.3)——安装Rancher
  • Aapche Nutch建立自己的搜索引擎
  • 阅读笔记(ICIP2023)Rectangular-Output Image Stitching
  • 就业班 第二阶段 2401--3.26 day6 Shell初识 连接vscode
  • 碳课堂|什么是碳资产?企业如何进行碳资产管理?
  • 如何使用 ChatGPT 进行编码和编程
  • 学习java第二十四天
  • 中小型集群部署,Docker Swarm(集群)使用及部署应用介绍
  • gateway做负载均衡
  • pytorch中的torch.hub.load()
  • R语言学习——Rstudio软件
  • 触发器的工艺结构原理及选型参数总结
  • Hana数据库 No columns were bound prior to calling SQLFetch or SQLFetchScroll
  • DevOps是什么
  • windows下的vscode + opencv4.8.0(C++) 配置
  • 微信小程序之多视频暂停播放,超出可视区域停止播放视频在自定义组件中实现案例
  • Java 加载外部 Jar 中的类并通过反射调用类中的方法
  • Arduino+ESP8266+华为云物联网平台实现智能开关
  • 使用 python 拆分 excel 文件
  • uniapp小程序中onShareAppMessage(OBJECT)实现带参数的分享功能