zoukankan      html  css  js  c++  java
  • EasyExcel优选的原因

    本文摘自:Java Excel数据导出方案及性能优化策略

    EasyExcel Demo

    HSSH、 XSSF、SXSSF方案对比

    导出1W条数据,12个字段,其中2个备注大文本字段;单线程;本地环境,使用spring boot搭建的web服务,eclipse配置 Xmx1024m,启动时占用内存44M左右,堆大小320M左右。
    耗时 文件大小 内存 cpu
    HSSH (xls) 5000条7min;
    1W条;
    36min
    1948KB 启动的时候暴增,5000条后暴增;
    800M左右
    12%-15%,较稳定
    XSSF (xlsx) 1W条50min 397KB 950M左右 12%-15%,较稳定
    SXSSF (xlsx 1W条3秒;
    10W25秒
    929KB 500M左右 峰值15%,稳定状态下0%

    SXSSF会将数据缓存到磁盘,旧的行数据不再出现在滑动窗口中并变得无法访问;最后将缓存合成一个文件的时候,会比较耗时间。

    之前做过的优化方案,使用高配服务器,开并发查数据,导出50+字段,其中5个以上大文本字段,平均1W条数据耗时不超过1秒。

    Apache POI官方介绍

    User Model的缺点是一次性将文件读入内存,构建一颗Dom树。并且在POI对Excel的抽象中,每一行,每一个单元格都是一个对象。当文件大,数据量多的时候对内存的占用可想而知。
    Event Model使用的方式是边读取边解析,并且不会将这些数据封装成Row、Cell这样的对象。而都只是普通的数字或者是字符串。并且这些解析出来的对象是不需要一直驻留在内存中,而是解析完使用后就可以回收。

    SXSSF、EasyExcel大数据量方案对比

    导出100W条数据,11个字段,其中1个备注大文本字段;单线程;本地环境,使用spring boot搭建的web服务, eclipse配置 Xmx1024m,启动时占用内存44M左右,堆大小320M左右。
    耗时 文件大小 内存 CPU 文件是否能打开
    SXSSF (xlsx) 176秒 62902KB 860M左右 12%左右 是,耗时较长
    EasyExcel (xlsx) 77秒 61678kb 60M左右 12%左右 是,耗时较长

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够让原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便(此处引用gitHub);

    测试对比结果可能会因为实现的方式不一样,实际的结果可能出入也比较大,但是EasyExcel相对SXSSF来说有优化是肯定的。

    性能优化策略

    1. 服务化,功能分离单独部署,选择支持大数据量的框架
    2. 提高服务器性能,CPU、内存、IO
    3. 并发查询数据,使用队列写数据,分批次执行
    4. 纯文本导出,去掉excel格式,这个点优化空间比较大
    5. 去掉实时交互,改为数据中心交互;后端使用队列控制请求并发
    6. …….
    I have a dream : Sandy beach B-J-N.
  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/mjtabu/p/14408711.html
Copyright © 2011-2022 走看看