首页 > 其他分享 >记录上个月execl导出40多万条库存记录导致OOM

记录上个月execl导出40多万条库存记录导致OOM

时间:2022-11-06 15:34:54浏览次数:75  
标签:execl 记录 OOM 导出 Cell 内存 poi 多万条 解析

以下是当时的处理流程:

  1. top CPU100%

  2. arthas attach failure

  3. jps -l

  4. jmap -histo:live | more

  5. heapdump

  6. MAT(JVisualVM)

  7. XSSFWorkbook修改成SXSSFWorkbook(POI的导出优化类,维护一个窗口大小,内存只会维持窗口大小的行的数据,超过的会把之前行数据刷到磁盘临时文件里,再把临时文件转为正常的xlsx文件格式输出

  8. 测试之后在JVisualVM观察内存上升和回收都很平稳,OOM问题解决。

excel导入模式

用户模式

  耗内存 类似用 WorkbookFactory.create(inputStream),poi 会把整个文件一次性解析,生成全部的Sheet,Row,Cell以及对象,如果导入文件数据量大的话,也很可能会导致OOM。

事件模式

  边读取边解析,并且不会将这些数据封装成Row,Cell这样的对象。解析出来的对象是不需要一直驻留在内存中,而是解析完使用后就可以回收。所以相比于User Model,Event Model更节省内存,效率也更。缺点就是上手难度高,需要一定的学习成本。

用户事件模式

  采用流式解析,我们不再面对Element的事件编程,而是面向StartRow,EndRow,Cell等事件编程。而提供的数据,也不再像之前是原始数据,而是全部格式化好,方便开发者开箱即用。大大简化了我们的开发效率。‘

参考:

  https://poi.apache.org/components/spreadsheet/how-to.html

  https://poi.apache.org/components/index.html

标签:execl,记录,OOM,导出,Cell,内存,poi,多万条,解析
From: https://www.cnblogs.com/road2master/p/16862678.html

相关文章

  • CSS+HTML初学跟踪项目记录笔记【防丢失,意义少,牢骚多多多】(文章发布系统)
    首先是笔记(未整理,可能有点乱)<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTD......
  • 逆向简单题记录
    关于最后的v7处在esp+40h的位置esp+40h-41=esp+17h此时再加5*v3[25]+v4可得到为v3数组中某值v3为行,v4为列......
  • java记录
    java记录java包package相同包中的类名不能重复,不同包中的类名可以重复包声明唯一,且位于第一行import关键字import可以有多行用于导入某一个类导入某个包里的所......
  • JAVA8-Lambda-FindFirst(获取列表中出现的第一条记录)
    寻找列表中的第一个元素描述:代码示例中list列表存在三条记录,findFirst是找出第一个出现的记录信息。publicstaticvoidmain(String[]args){ArrayList<Stu......
  • 2022-11-05 三度背离和第一次背驰记录
    趋势改变之前,跌破趋势线之前,跌破最后一个中枢之前,再背离,你也不能说趋势终结了。三度背离之后有调整,但是调整之后方向如何,要继续跟随。案例一:纳斯达克5分钟图5分钟的三度......
  • 记录一下常用的git命令
     ##1、撤销修改后的文件1.本地*修改*了一些文件(并没有使用gitadd到暂存区),想放弃修改-单个文件/文件夹:```shellgitcheckout--filename```-所有文......
  • MySQL表加字段可为null导致ArrayIndexOutOfBoundsException报错问题记录
    问题爆出企微群告警爆了,立即去看ELK报错日志,报错日志非常莫名其妙:​​java.lang.ArrayIndexOutOfBoundsException:16​​原因分析事后发现共有18257次报错日志,时间跨度19:......
  • 实验室服务彻底死机记录——硬件故障——主板pcie槽坏掉或显卡坏掉
    实验室的深度学习服务器这次是彻底坏掉了,以前死机都是会在log日志中找到些信息,这次死机死的干脆,什么log都没有就自动关机了,神奇的很,以前的服务器死机可能还算是假死,这次的死......
  • 数据库记录
    mysqldump-B在备份数据库的时候会在备份的语句中写入createdatabase的语句,导回来的时候就不需要指定库了,在-B的后面可以添加多个库的名字。--singe-transaction这个参......
  • 22-11-5学习记录
    1,<assert.h>  assert() {在传参时要养成使用assert的习惯,可以帮助我们找到程序bug}  作用:断言,判断指针是否为空,检查参数是否满足要求,以免引起程序崩溃  例:asse......