专业网站建设推荐/关键词优化一般收费价格
➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan
欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。
本文章CSDN首发,欢迎转载,要注明出处哦!
先感谢优秀的你能认真的看完本文,有问题欢迎评论区交流,都会认真回复!
🔓为什么POI的SXSSFWorkbook占用内存更小?
- 🏆POI的SXSSFWorkbook
- 🏆POI的SXSSFWorkbook占用内存
- 🏆扩展
- 配置行缓存限制
🏆POI的SXSSFWorkbook
SXSSFWorkbook类是Apache POI库的一部分,它是一个流行的Java库,用于读写Microsoft Office文件。
SXSSFWorkbook类代表XSSFWorkbook类的流版本,用于创建和操作Excel(.xlsx)文件。
通过使用SXSSFWorkbook类,您可以处理大型Excel文件而不会遇到OutOfMemoryError,因为它将数据写入临时文件而不是全部保存在内存中。这使得处理大型数据集时非常高效。
以下是使用SXSSFWorkbook创建Excel文件的示例:
import org.apache.poi.xssf.streaming.SXSSFWorkbook;import org.apache.poi.xssf.usermodel.XSSFSheet;import org.apache.poi.xssf.usermodel.XSSFRow;import org.apache.poi.xssf.usermodel.XSSFCell;import java.io.FileOutputStream;public class ExcelWriter {public static void main(String[] args) {try (SXSSFWorkbook workbook = new SXSSFWorkbook(); // 创建一个SXSSFWorkbook对象FileOutputStream outputStream = new FileOutputStream("output.xlsx")) { // 创建一个文件输出流XSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建一个名为"Sheet1"的工作表// 创建行和单元格for (int rowNum = 0; rowNum < 10; rowNum++) {XSSFRow row = sheet.createRow(rowNum); // 创建一行for (int cellNum = 0; cellNum < 5; cellNum++) {XSSFCell cell = row.createCell(cellNum); // 创建一个单元格cell.setCellValue("Row " + rowNum + ", Cell " + cellNum); // 设置单元格的值}}workbook.write(outputStream); // 将工作簿写入文件} catch (Exception e) {e.printStackTrace();}}
}
在这个示例中,我们创建了一个新的SXSSFWorkbook,然后在其中创建了一个sheet,并将sheet填充了行和单元格。最后,我们使用FileOutputStream将工作簿写入输出文件中。
🏆POI的SXSSFWorkbook占用内存
SXSSFWorkbook 类是为了处理大型 Excel 文件而设计的。它的实现原理是通过将部分数据写入磁盘上的临时文件来减少内存占用。
在SXSSFWorkbook类中,有一个类叫做sheetDataWriter,这个类的作用就是将部分数据写入磁盘上的临时文件的。
public class SXSSFWorkbook implements Workbook {protected SheetDatalriter createSheetDatawriter() throws IOException {if( compressTmpFiles) {return new GZIPSheetDatawriter( sharedStringSource);}return new SheetDatawriter( sharedStringSource);}
}
写入过程是在 SheetDataWriter 的 writeRow 方法中实现的。此方法会被 SXSSFSheet 调用,以将行数据转换成XML 并写入临时文件。
public void writeRow(int rownum,SXSSFRow row) throws IOException {if ( numberOfFlushedRows == 0) _lowestIndex0fFlushedRows = rownum;_numberLastFlushedRow = Math.max(rownum, numberLastFlushedRow);_numberOfCellsOfLastFlushedRow = row.getLastCellNum();_numberOfFlushedRows++;beginRow(rownum, row);Iterator<Cel1> cells = row.allCellsIterator();int columnIndex = 0;while (cells.hasNext()) {writeCell(columnIndex++, cells.next());}endRow();
}
writeRow()方法会循环调用writeCell()方法:
public void writeCell(int columnIndex,Cell cell) throws IOException {if (cell == null) {return;}String ref = new CellReference( rownum, columnIndex).formatAsString();_out.write("<c");writeAttribute("r", ref);Cellstyle cellstyle = cell.getCellstyle();if (cellstyle.getIndex() != ) {// need to convert the short to unsigned short as the indexes can be up to 64k// ideally we would use int for this index, but that would need changes to some more//APIswriteAttribute("s",Integer.toString(cellStyle.getIndex() & 0xffff));}CellType cellType = cel1.getCellType();switch (cellType) {case BLANK: {_out.write('>');break;}case FORMULA: {switch(cell.getCachedFormulaResultType()) {case NUMERIC:writeAttribute("t","n");break;case STRING:writeAttribute("t",STCellType.STR.toString());break;case BOOLEAN:writeAttribute("t","b");break;case ERROR:writeAttribute("t","e");break;}_out.write("><f>");outputQuotedString(cell.getCellFormula());_out.write("</f>"):switch (cell.getCachedFormulaResultType()) {case NUMERIC:double nval = cell.getNumericCellValue();if (!Double.isNaN(nval)) {_out.write("<v>");_out.write(Double.tostring(nval));_out.write("</v>");}break;case STRING:String value = cell.getstringCellValue();if(value != null && !value.isEmpty()) {_out.write("<v>");_out.write(value);_out.write("</v>");}break;case BOOLEAN:_out.write("><v>");_out.write(cell.getBooleanCellValue() ?“1” :"0");_out.write("</v>");break;case ERROR: {FormulaError error = FormulaError.forInt(cell.getErrorCellValue());_out.write("><v>");_out.write(error.getString());_out.write("</v>");break;}}break;}case STRING: {if ( sharedStringSource != null) {XSSFRichTextString rt = new XSSFRichTextString(cell.getStringCellValue());int sRef = sharedStringSource.addSharedStringItem(rt);writeAttribute("t",STCellType.s.toString());_out.write("><v>");_out.write(String.value0f(sRef));_out.write("</v>");} else {writeAttribute("t","inlineStr");_out.write("><is><t");if (hasLeadingTrailingSpaces(cell.getStringCellValue())) {writeAttribute("xml:space","preserve");}out .write(">");outputQuotedstring(cell.getstringCellValue());_out.write("</t></is>");}break;}case NUMERIC: {writeAttribute("t","n");_out.write("><v>");_out.write(Double.toString(cell.getNumericCellValue()));_out .write("</v>”) ;break;}case BOOLEAN: {writeAttribute("t","b");_out .write("><v>”) ;_out.write(cell.getBooleanCellValue() ?"1” :"0");out.write("</v>");break;}case ERROR: {FormulaError error = FormulaError.forInt(cell.getErrorCellValue());writeAttribute("t","e");_out .write("><v>”);_out.write(error.getstring());_out.write("</v>");break;}default: {throw new IllegalStateException("Invalid cell type: " + cellType);}}_out.write("</c>");}
在这个方法中,数据会在 out.write(…) 调用时写入磁盘,这里的_out其实就是一个写入磁盘文件的Writer,他的write方法就会把内容写入到临时文件中。
我尝试着在 out初始化的地方,也就是:
public SheetDatawriter() throws IOException {_fd = createTempFile();_out = createWriter( fd);
}
中加了断点,就能在运行过程中找到这个临时文件,tail一下临时文件就会发现它不断地有文件写入。
感兴趣的也可以debug看一下这个临时文件的内容,其实它就是一个xml文件,然后写入的就是我们excel中的内容。
所以,在SXSSFWorkbook中,我们在写入文件时,并不是把所有内容都暂留在内存内,而是会把部分数据写入临时文件,来减少对内存的占用,内存中只保留当前的一部分数据,这样就可以避免内存溢出的问题了。
🏆扩展
配置行缓存限制
我们可以主动设置行缓存限制,超过这个限制的数据将被写入磁盘上的临时文件。在创建SXSSFWorkbook的时候,可以指定rowAccessWindowSize来实现。
/*** Construct an empty workbook and specify the window for row access.* <p>* When a new node is created via (@link SXSSFSheet#createRow) and the total number* of unflushed records would exceed the specified value, then the* row with the lowest index value is flushed and cannot be accessed* via f@link SXSSFSheet#getRow] anymore.* </p>* <p>* A value of <code>-1</code> indicates unlimited access. In this case all* records that have not been flushed by a call to <code>flush()</code> are available* for random access.* </p>* <p>* A value of <code>0</code> is not allowed because it would flush any newly created row* without having a chance to specify any cells.* </p>* @param rowAccesslindowSize the number of rows that are kept in memory until flushed out , see above.*/public SXSSFWorkbook(int rowAccesswindowSize){this(null /*workbook*/, rowAccessWindowSize):}
相关文章:

【昕宝爸爸小模块】深入浅出之为什么POI的SXSSFWorkbook占用内存更小
➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…...

CentOS安装Flume
CentOS安装Flume 一、简介二、安装1、下载2、解压3、创建配置文件4、启动flume agent5、验证 一、简介 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexi…...

Qt 多次绘图
使用Qt 的时候发现: 背景:自己定义一个类,把它和某个ui文件绑定。(类似 Qt creator 默认创建的工程)问题:当鼠标在窗口内单击的时候会触发2次绘图。?难道不应该是一次吗? 于是开始了如下的测试…...

设计模式介绍
概念: 设计模式是一套被反复使用的、多数人知晓、经过分类编目的优秀代码设计经验的总结。特定环境下特定问题的处理方法。 1)重用设计和代码 重用设计比重用代码更有意义,自动带来代码重用 2)提高扩展性 大量使用面向接口编程&…...

linux 之 ln 命令
linux 之 ln 命令 在Linux中,ln 命令用于创建文件或目录的链接。它有两种主要类型的链接。 硬链接(Hard Links) 硬链接实际上是原始文件的另一个引用,指向同一个inode(索引节点),这意味着它们共…...

【设计模式】张一鸣笔记:责任链接模式怎么用?
我将通过一个贴近现实的故事——请假审批流程,带你了解和掌握责任链模式。 什么是责任链模式? 责任链模式是一种行为设计模式,它让你可以避免将请求的发送者与接收者耦合在一起,让多个对象都有处理请求的机会将这个对象连成一条…...

Vulnhub-dc4
靶场下载 https://download.vulnhub.com/dc/DC-4.zip 信息收集 判断目标靶机的存活地址: # nmap -sT --min-rate 10000 -p- 192.168.1.91 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-21 16:36 CST Stats: 0:00:03 elapsed; 0 hosts completed (1 up…...

MySQL45道练习题
作业需要数据表SQL语句已给 1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 select * from Student RIGHT JOIN (select t1.SId, class1, class2 from(select SId, score as class1 from sc where sc.CId 01)as t1, (select SId, score as …...

HTML5和CSS3的新特性
HTML5的新特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等 1,HTML5新增的语义化标签 <header> 头部标签 <nav> 导航标签 <article> …...

【MySQL】表列数和行大小限制详解
目录 限制维度 列数量限制 表的最大行大小 单个列的存储要求 存储引擎的附加限制 功能键部分 行容量限制 MySQL表的内部实现 InnoDB表的最大行大小 超出InnoDB最大行大小的处理 不同存储格式的影响 限制示例 行大小限制示例 InnoDB下 MyISAM下 InnoDB变长情况示…...
算法基础学习|双指针算法
双指针算法 代码模板 for (int i 0, j 0; i < n; i ){while (j < i && check(i, j)) j ;// 具体问题的逻辑 } 常见问题分类:(1) 对于一个序列,用两个指针维护一段区间(2) 对于两个序列,维护某种次序,比如归并…...

4.远程登录服务
目录 1. 简介 1.1. 概念 1.2. 功能: 1.3. 分类 1.3.1. 文字接口: 1.3.2. 图形接口: 1.4. 文字接口连接服务器: 2. 连接加密技术简介 2.1. 密钥解析: 3. SSH工作过程: 3.1. 版本协商阶段 3.2. 密钥和算法协商阶段 3.3. 认证阶段(两…...

代码随想录算法训练营第二十九天| 491.递增子序列、46.全排列、47.全排列 II
491.递增子序列 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 解题思路:同层相同元素要跳过 java: class Solution {List<List<Integer>> resultnew ArrayList<>();List<Integ…...

基于若依的ruoyi-nbcio流程管理系统一种简单的动态表单模拟测试实现(五)
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/n…...

多场景建模:阿里多场景多任务元学习方法M2M
multi-scenario multi-task meta learning approach (M2M) 背景 广告领域大部分是针对用户建模的,像点击率预估,很少有针对广告主需求建模(广告消耗预估、活跃率/流失率预估、广告曝光量预估),广告的类型较多&#x…...

仿真机器人-深度学习CV和激光雷达感知(项目2)day03【机器人简介与ROS基础】
文章目录 前言机器人简介机器人应用与前景机器人形态机器人的构成 ROS基础ROS的作用和特点ROS的运行机制ROS常用命令 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫本文内容是我为复试准备的第二个项目 💫欢迎…...

【多商户开源-BSD- Fecmall 电商平台】
关于Fecmall Fecmall 关于,Fecmall介绍 Fecbbc开源BSD多商户系统,真正开源,商用免费授权的多商户系统 Fecmall系统简介: 全称为Fancy ECommerce Shop, 着重于电商架构的研发优化,全新定义商城的架构体系&…...

2023春秋杯冬季赛 --- Crypto wp
文章目录 前言Cryptonot_wiener 前言 比赛没打,赛后随便做一下题目 Crypto not_wiener task.py: from Crypto.Util.number import * from gmpy2 import * import random, os from hashlib import sha1 from random import randrange flagb x bytes_to_long(f…...

ImageMagick使用手册
ImageMagick使用手册 文章目录 ImageMagick使用手册ImageMagick是什么指令总结1.查看版本2.官网验证指令解读3.svg转png4.png转ico5.将指定文件夹中的所有PNG图像转换为ICO图标 本教程持续更新,我学到多少就更新多少。关于ffmpeg如何安装可以看上一篇博客win系统环境…...

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第五天-Qt编程技巧若干解答(物联技术666)
链接:https://pan.baidu.com/s/1-u7GvgM0TLuiy9z7LYQ80Q?pwd1688 提取码:1688 QT在Windows下制作图表 QT是跨平台的程序设计库,在windows下的程序往往想要有一个好看的图标,方法如下: 1.准备个ICO图标。例如&…...

【蓝桥杯选拔赛真题59】python小写字母 第十五届青少年组蓝桥杯python 选拔赛比赛真题解析
目录 python小写字母 一、题目要求 1、编程实现 2、输入输出...

代码随想录算法训练营Day37|738.单调递增的数字、贪心算法总结
目录 738.单调递增的数字 方法一:暴力解法 方法二:贪心解法 贪心算法总结 738.单调递增的数字 题目链接 文章链接 方法一:暴力解法 class Solution { private:// 各位递增判断函数bool checkNum(int num) {int max 10;while (num) {int …...

笔记-影响力-对比,互惠,赌徒原理
笔记 From 《影响力》 目录 C1 影响力的武器 C2:互惠 C3 承诺和一致 C4:社会认同 C5:喜好 C6:权威 C7:稀缺 Ankie的笔记:对比,互惠,赌徒原理 C1 影响力的武器 人类在认知方面有个原理,叫“对比原理”。 假设有人走进一…...

PIL、cv2、numpy,和pytorch(torch)之间的转换
在图像处理和深度学习中,经常需要在PIL(Python Imaging Library)、OpenCV(cv2)、NumPy和PyTorch之间进行图像数据的转换。下面是这些库之间常见的转换方法。 1. PIL和numpy之间的转换 import numpy as np from PIL i…...

Java面试题50道
文章目录 1.谈谈你对Spring的理解2.Spring的常用注解有哪些3.Spring中的bean线程安全吗4.Spring中的设计模式有哪些5.Spring事务传播行为有几种6.Spring是怎么解决循环依赖的7.SpringBoot自动配置原理8.SpringBoot配置文件类型以及加载顺序9.SpringCloud的常用组件有哪些10.说一…...

电脑怎么剪辑视频?这些软件不可错过
电脑怎么剪辑视频?随着视频时代的到来,越来越多的人开始涉足视频制作。从Vlog到短片,再到专业级的影视作品,视频已经成为了我们生活中不可或缺的一部分。那么,如何才能快速掌握视频剪辑技巧,制作出令人惊叹…...

HBase学习七:Compaction
1、简介 Compaction是从一个Region的一个Store中选择部分HFile文件进行合并。其目的为了减少 HFile 的个数跟清理掉过期和删除的数据。 合并原理是,先从这些待合并的数据文件中依次读出KeyValue,再由小到大排序后写入一个新的文件。之后,这个新生成的文件就会取代之前已合…...

MySQL定期整理磁盘碎片
MySQL定期整理磁盘碎片:提升数据库性能的终极指南 MySQL作为一个强大的关系型数据库管理系统,在长时间运行后可能会产生磁盘碎片,影响数据库性能。本博客将深入讨论如何定期整理MySQL磁盘碎片,以确保数据库的高效运行。我们将介绍…...

【centos7安装docker】
背景: 学习docker,我是想做一个隔离环境,并且部署的话,希望实现自动化,不为安装软件而烦恼,保证每个人的环境一致。 2C4G内存 50G磁盘的虚拟机事先已经准备完毕。 1.查看下centos版本,docker要…...

四、Flask学习之JavaScript
四、Flask学习之JavaScript JavaScript,作为一种前端脚本语言,赋予网页生动的交互性和动态性。通过它,开发者能够操作DOM(文档对象模型)实现页面元素的动态改变、响应用户事件,并借助AJAX技术实现异步数据…...