百万数据报表导出与读取解决方案

先了解下excel版本区别

 excel2003excel2007及以上
后缀.xls.xlsx
结构二进制格式xml数据结构
特点存储容量有限xml压缩,占用空间小,操作效率高

 

可以看到2007及以上版本为xml数据结构,对后续海量数据处理起到关键作用。

apachePoi官方对excel2007使用xssf对象,可以分为三种模式:

用户模式:有很多封装的方法,但非常耗内存

事件模式:基于sax方式解析xml,它可以逐行扫描xml文档,一边扫描一边解析(扩展:dom解析是把所有数据一次性加载到内存)

sxssf对象:通过临时存储空间生成excel,用来导出海量数据excel文件

百万数据导出

出现的问题:当使用poi工具导出数据报表时,系统在导出时出现oom异常

分析问题:使用VisualVM工具监测到在导出报表的过程中,不断的触发垃圾回收,堆内存越来越多,最后导致oom;可以推测出poi解析报表数据时是一次性加载内存中,内存不足触发垃圾回收,然而不断有数据加载到内存,直至jvm发生oom。

解决方案:使用sxssf对象来导出海量数据。sxssf对象操作数据报表时设置内存中对象数量的最大数量,当超过阀置,则会创建临时磁盘.xml文件,不断将内存的数据存入临时文件并清空内存去加载未处理的对象数据,这样内存中对象的数量是固定,就不会照成内存溢出

注意事项:因为将数据存入临时文件是对磁盘进行操作,而写磁盘的速度比内存慢很多,可能会出现写临时文件照成拥堵

百万数据读取

出现问题:当使用poi工具读取百万数据报表,系统在读取时出现oom异常

分析问题:和百万数据导出出现的问题一致:加载到内存的数据过大,导致内存溢出

解决方案:基于事件模式读取百万数据,使用sax逐行读取,一边读取一边解析,使用完即销毁本条数据,因此不需要将数据存储到内存中,避免了内存溢出

注意事项:因为是用完一行则销毁,则不能重复使用数据

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值