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.
  • 相关阅读:
    【JOB】Oracle中JOB的创建方法以及一个细节的探究
    PHP安装加载yaf扩展
    微信开发(1) -- 将本地开发环境映射到公网访问
    修改Nginx与Apache上传文件大小限制
    liunx系统安装composer与配置
    Mysql 5.7 liunx 忘记密码的补救方法
    Vim使用技巧(4) -- 命令行模式 【持续更新】
    Vim使用技巧(3) -- 可视化模式技巧 【持续更新】
    Vim使用技巧(2) -- 插入模式技巧 【持续更新】
    Postman 安装及使用入门教程
  • 原文地址:https://www.cnblogs.com/mjtabu/p/14408711.html
Copyright © 2011-2022 走看看