cpu java poi 导出_Java里当POI导出Excel数据比较大时的优化方案

问题

在Java里绝大多数都是使用POI进行导入导出Excel,正常情况下也都没有问题。但当导出的数据量比较大时,我留意到我本机当数据量达到两三万条(二十个列)时,就会出现内存溢出,CPU飙升到95%以上的情况。

可能换到好点的服务器上会好点,但情况并不会好太多,还是会存在瓶颈。

解决

使用 SXSSFWorkbook 类代替原来的 XSSFWorkbook 类,SXSSFWorkbook 是3.8以上的POI才开始支持。SXSSFWorkbook 相对于 XSSFWorkbook 进行了一些优化,SXSSFWorkbook是streaming 版本的XSSFWorkbook,它只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到硬盘里(Windows电脑是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的rows是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。在数据量超过设定的值时,它会用硬盘空间来大幅降低堆内存的占用,在系统的临时文件夹目录创建一个临时文件,然后将所有大于预设行数的数据都存入临时文件,这样就降低了内存的压力,从而实现以硬盘空间换取内存空间,避免内存溢出和频繁GC导致的CPU飙升。

注:HSSFWorkbook和XSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,(>=2007版)是1048576行,16384列。

使用

引入pom,需要注意的是4.0.0版本的JDK需要1.8以上,如果JDK是1.7的,那么就使用3.8或者3.9版本的依赖。

org.apache.poi

poi-ooxml-schemas

4.0.0

org.apache.poi

poi-ooxml

4.0.0

org.apache.poi

poi

4.0.0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

org.apache.poi

poi-ooxml-schemas

4.0.0

org.apache.poi

poi-ooxml

4.0.0

org.apache.poi

poi

4.0.0

我们要注意SXSSFWorkbook构造器有一些参数,其中有一个rowAccessWindowSize,代表指定的内存中缓存记录数,默认为100,它代表能从Sheet窗口看到多少刚才Create了多少Row,超过的就都放到磁盘里了,如果你设置rowAccessWindowSize为1000,那么你只能看到1000条新创建的数据,如果设置为-1,就会看到全部创建的数据。

SXSSFWorkbook workbook = null;

OutputStream outputStream = null;

try {

outputStream = response.getOutputStream();

// 创建工作簿使用的是SXSSFWorkbook

workbook = new SXSSFWorkbook(1000);

// 设置数据压缩

workbook.setCompressTempFiles(true);

Sheet sheet = workbook.createSheet("表名");

Row titleRow = sheet.createRow(0);

Cell cell = titleRow.createCell(0);

cell.setCellValue("内容");

// 将工作簿写入输出流

workbook.write(outputStream);

} catch (Exception e) {

e.printStackTrace();

}finally {

if (workbook != null) {

// 处理掉临时文件

workbook.dispose();

}

if (outputStream != null) {

outputStream.close();

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

SXSSFWorkbookworkbook=null;

OutputStreamoutputStream=null;

try{

outputStream=response.getOutputStream();

// 创建工作簿使用的是SXSSFWorkbook

workbook=newSXSSFWorkbook(1000);

// 设置数据压缩

workbook.setCompressTempFiles(true);

Sheetsheet=workbook.createSheet("表名");

RowtitleRow=sheet.createRow(0);

Cellcell=titleRow.createCell(0);

cell.setCellValue("内容");

// 将工作簿写入输出流

workbook.write(outputStream);

}catch(Exceptione){

e.printStackTrace();

}finally{

if(workbook!=null){

// 处理掉临时文件

workbook.dispose();

}

if(outputStream!=null){

outputStream.close();

}

}

浏览量:

874

0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器在行例维护中,8月14日服务器例行维护公告

原标题&#xff1a;8月14日服务器例行维护公告亲爱的玩家&#xff1a;青龙乱舞区、大地飞鹰区、天命风流区、沧海云帆区全部服务器将在8月14日6:00~10:00停机维护更新&#xff0c;维护完成后上述各服务器客户端版本更新至2.0.94.6。本次维护主要调整和修改内容如下&#xff0c;…

dedecms联动筛选_DEDECMS分类信息按联动类别筛选的实现方法

注意&#xff1a;本教程只在DedeCMS V5.6上测试过&#xff0c;v5.7sp1的话一般也会通用&#xff0c;请自行测试&#xff01;实现方法&#xff1a;1. 修改include\taglib\infolink.lib.php&#xff0c;找到&#xff1a;require_once(DEDEROOT./data/enums/infotype.php);在其下面…

暗黑2战网服务器爆率修改,暗黑2修改MOD最初级基础

第一步&#xff1a;得到修改所用的工具修改MOD首要的是工具&#xff0c;这里推荐几款常用工具&#xff1a;MPQ文件打开及导入工具&#xff1a;MPQWorkshop 备用&#xff1a;mpqview CV5.x (初级入门推荐mpqworkshop&#xff0c;必需)MPQWorkshop是目前最好的工具&#xff0c;主…

delphi listview 添加数据 慢_Delphi 二十四岁, Delphi 10.3.1 发布

Delphi1 是 Borland于1995年2月14日发布&#xff0c;因此2019年2月14日是该产品发布的24周年纪念日。如果你想了解一些关于该产品及其发布的历史&#xff0c;你可以参考文章“22 Years of Delphi and it Still Rocks”。在那篇文章中&#xff0c;我收集了一些早期产品的照片&am…

找规律万能公式_有一个万能公式,可以帮你解决任何烦恼!

有一个万能公式&#xff0c;可以帮你解决任何烦恼。我是在十几年前学到的&#xff0c;一直使用到现在。不仅简单&#xff0c;而且非常有效&#xff0c;只有3步&#xff0c;马上就能现学现用。如果你目前正好碰到了什么难题&#xff0c;不妨试试这个万能公式。01第一步&#xff…

python 目录下的文件_用python把文件夹下的所有文件包括文件夹里面的文件都拷贝到同一个目录下...

比如1文件夹下有2文件夹&#xff0c;2文件夹下有1.txt文件和3文件夹&#xff0c;3文件夹下有2.txt3.txt现在要把1.txt2.txt3.txt全都拷贝到1文件夹下importosimportshutildefchange(path,path1):i1#printi... 比如1文件夹下有2文件夹&#xff0c;2文件夹下有1.txt文件和3文件夹…

vue 判断两对象是否一致_你的.vue文件就已经是你的文档了

更新&#xff1a;文档地址&#xff1a;http://vuese.org昨天发布了vuese1.0&#xff0c;这是我的一个新的开源项目&#xff0c;用来解析Vue SFC并生成markdown文档&#xff0c;如下&#xff1a;HcySunYang/vuese​github.com这篇文章不会介绍如何使用&#xff0c;至于如何使用大…

centos7 oracle_Centos7主机名变成bogon的原因及解决方法

问题描述虚拟机在设置完静态IP后&#xff0c;莫名其妙地主机名就变成了bogon&#xff0c;并且问题会稳定复现&#xff0c;就是说每次重启都会。如下图所示&#xff1a;看着不顺眼不说&#xff0c;听说可能还会影响某些服务&#xff0c;如可能导致oracle安装过程网络配置出错等问…

get 参数太长怎么办_新买的手表表带太长了该怎么办?表带调节操作方法get你~...

表表哥点击☝上方蓝字关注我们表带是手表的重要组成部分&#xff0c;同时表带决定着手表佩带的舒适性&#xff0c;方便性&#xff0c;对手表的安全也有关系。现在表带的材质也很多&#xff0c;最常见的就是不锈钢的和真皮的。买过手表的人应该都知道&#xff0c;只有是专门定制…

python pandas合并多个excel_python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件)...

# python pandas合并多个excel(xls和xlsx)文件&#xff08;弹窗选择文件夹和保存文件&#xff09; import tkinter as tk from tkinter import filedialog import os import pandas as pd import glob root tk.Tk() root.withdraw() # 选择文件夹位置 filelocation os.path.n…

elasticsearch初次查询超时_ElasticSearch的工作流程

1.ElasticSearch的工作流程​ 1.启动过程​ 当ElasticSearch节点启动时&#xff0c;使用发现(discovery)模块来发现集群中的其他节点(配置文件的集群名称)并连接.ElasticSearch会发送广播&#xff0c;以找到相同集群名称其他节点。​ 集群选举一个节点为主节点。该节点负责分发…

modbus slave如何使用_【干货】如何进行PLC远程监控?只需三个步骤,马上帮你解决问题!...

工厂里的工程师小威最近真的很头痛&#xff0c;公司客户的一台或多台设备分布在不同的地区或国外&#xff0c;如果要对其PLC、HMI等自控产品进行远程控制、调试和维护。除了问题&#xff0c;经常要千里迢迢奔赴国外进行维护。最近有事特殊时期&#xff0c;国外疫情比较乱套&…

智能卡门禁管理系统_出入口门禁控制系统与消防火灾报警系统怎么联动?

门禁系统作为一个控制进出的设备&#xff0c;在发生火灾时如何快速打开所有防火逃生门时&#xff0c;是需要弱电单位对门禁系统要行动考虑&#xff0c;否则容易出现隐患&#xff0c;万一出现火灾&#xff0c;因为门禁是常闭门造成人员无法快速逃生那是肯定要负一定的责任的。如…

两表格合并_六个高效办公Excel小技巧,让你提前下班两小时!

每天下午一点&#xff0c;PPT技能进步一点大家中午好呀&#xff01;大家好这是我们的抖音号PPT模板抖音搜索“PPT1080”就可以啦更多福利等你来拿&#xff01;小编发现抖音里无奇不有有关于Excel的小知识点也很多今天就带大家盘点一下抖音里最火爆的6个Excel小技巧点滴积累可以…

mybatis获取表名_mybatis plus 的动态表名的配置详解

mybatis plus简介详见mybatis plus的官网业务要求业务上要求存储数据的时候根据某个字段动态的选择数据要存储的表.如根据code字段: code->[1001,1002]来进行选择存储的表:经过下面的配置实现动态表名如 --> table1_1001,table_1002的效果.以此动态生成表名的效果.具体实…

python能做数据库开发吗_5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学...

1. 它是内置的,不需要安装,节省很多麻烦。2. 使用方便,不需要复杂的连接配置,打开本地文件一样简单。3.方便转移。数据库是一个文件。复制、传输和删除可以很容易地处理。4所示。轻量级的性能比大多数其他数据库应用程序。5. 完整的SQL语言支持类似于其他SQL数据库。学习后,很容…

卷的作用_还在盲目的制作蛋糕卷吗?先来搞懂这几种蛋糕卷面糊~

柔软湿润的蛋糕卷制作简单&#xff0c;可以随意搭配各种柔滑的馅料使得蛋糕卷的口味变化多端。不分男女老少&#xff0c;任谁都能恣意品尝&#xff0c;只要随手一切&#xff0c;你一块我一块地与人一同享用&#xff0c;其乐融融。蛋糕卷の基础材料要做好蛋糕卷首先要认识基本材…

spring elasticsearch 按条件删除_实战:项目数据源转为Elasticsearch

原本项目是基于MYSQL的&#xff0c;现因需求将其转换为MYSQLElasticsearch&#xff0c;MYSQL的ORM使用的是Spring Data Jpa&#xff0c;Mybatis的转换与其类似&#xff0c;有人看再更先看原项目原项目的DAO层Repository public interface UserRepository extends JpaRepository…

android接口类命名规范_超全面的UI基础设计规范来啦,还不收藏 ~

写在前面的话 很多刚入行的UI设计师开始接触移动端UI设计的时候&#xff0c;对于基础的界面尺寸规范可能会有一定的模糊认知&#xff0c;导致做出来的界面往往会感觉不是那么和谐&#xff0c;却也不知道怎么去完善和改进。对于大多数的刚入行者来说&#xff0c;如果不是有天赋…

mysql按升序创建索引_MySQL 降序索引

MySQL 降序索引简介&#xff1a;在本教程中&#xff0c;您将了解MySQL降序索引以及如何利用它来提高查询性能。MySQL降序索引简介降序索引是以降序存储键值的索引。在MySQL 8.0之前&#xff0c;您可以DESC在索引定义中指定。但是&#xff0c;MySQL忽略了它。与此同时&#xff0…