当前位置: 首页 > news >正文

邯郸手机网站建设重庆建设工程安全信息管理网

邯郸手机网站建设,重庆建设工程安全信息管理网,wordpress弹窗登录代码,厦门百度整站优化服务➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你#x1f44d;点赞、#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发#xff0c;欢迎转载#xff0c;要注明出处哦#xff01; 先感谢优秀的你能认真的看完本文… ➡️博客首页       https://blog.csdn.net/Java_Yangxiaoyuan        欢迎优秀的你点赞、️收藏、加❤️关注哦。        本文章CSDN首发欢迎转载要注明出处哦        先感谢优秀的你能认真的看完本文有问题欢迎评论区交流都会认真回复 什么是POI为什么它会导致内存溢出 ✅ 一、什么是POI✅1.1 Excel并没看到的那么小✅1.2 POI的溢出原理 ✅ 二、拓展知识仓✅2.1 几种Workbook格式✅2.2 SXSSFWorkbook是什么✅2.3 SXSSFWorkbook有哪些优点和缺点 ✅ 一、什么是POI Apache POl是一个非常流行的文档处理工具通常大家会选择用它来处理Excel文件。但是在实际使用的时候经常会遇到内存溢出的情况那么为啥他会导致内存溢出呢? ✅1.1 Excel并没看到的那么小 我们通常见到的xlsx文件其实是一个个压缩文件。它们把若千个XML格式的纯文本文件压缩在一起Excel就是读取这些压缩文件的信息最后展现出一个完全图形化的电子表格。 所以如果我们把xlsx文件的后缀更改为.zip或 .rar再进行解压缩就能提取出构成Excel的核心源码文件。解压会发现解压后的文件中有3个文件夹和1个XML格式文件: _rels 文件夹看里面数据像是一些基础的配置信息,比如 workbook 文件的位置等信息一般不会去动它。 docProps 文件夹下重要的文件是一个app.xml,这里面主要存放了 sheet 的信息如果想添加或编辑 sheet 需要改这个文件其他文件都是一些基础信息的数据比如文件所有者创建时间等。 x文件夹是最重要的一个文件夹里面存放了Sheet 中的数据行和列的格式单元格的格式sheet的配置信息等等信息。 所以实际上我们处理的xlsx文件实际上是一个经过高度压缩的文件格式背后是有好多文件支持的。所以我们看到的一个文件可能只有2M但是实际上这个文件未压缩情况下可能要比这大得多。 也就是说POI在处理的时候处理的实际上并不只是我们看到的文件大小实际上比它的大小要大好几倍。 这是为什么明明我们处理的文件只有100多兆但是实际却可能占用1G内存的其中一个原因。当然这只是其中一个原因还有一个原因我们就需要深入到POI的源码中来看了。 ✅1.2 POI的溢出原理 我们拿POI的文件读取来举例一般来说文件读取出现内存溢出的情况更多一些。以下是一个POI文件导出的代码示例 import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.File; import java.io.FileInputStream; import java.io.IOException;public class ExcelReadTest {public static void main(String[] args) {//指定要读取的文件路径String filename example.xlsx;try (FileInputStream fileInputStream new FileInputStream(new File(filename))) {//创建工作簿对象Workbook workbook new XSSFWorkbook(fileInputStream);// 获取第一个工作表Sheet sheet workbook.getSheetAt(0);//遍历所有行for (Row row : sheet) {// 遍历所有单元格for (Cell cell : row) {Thread.sleep(100); //添加注释暂停程序执行100毫秒// 根据不同数据类型处理数据switch (cell.getCellType()) {case STRING:System.out.print(cell.getStringCellValue() \t); //添加注释输出单元格的字符串值break;case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {System.out.print(cell.getDateCellValue() t); //添加注释输出单元格的日期值} else {System.out.print(cell.getNumericCellValue() t); //添加注释输出单元格的数值}break;case BOOLEAN:System.out.print(cell.getBooleanCellValue() t); //添加注释输出单元格的布尔值break;case FORMULA:System.out.print(cell.getCellFormula() t); //添加注释输出单元格的公式break;default:System.out.print(); //添加注释不做任何操作}}System.out.println(); //添加注释换行}} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {throw new RuntimeException(e);}} } 这里面用到了一个关键的XSSFWorkbook类 public XSSFWorkbook(InputStream is) throws IOException {this(PackageHelper.open(is); } public static OPCPackage open(InputStream is) throws IOException {try {return OPCPackage.open(is);}catch (InvalidFormatException e) {throw new POIXMLException(e);} }最终会调用到OPCPackage.open方法看看这个方法是怎么实现的 /*** Open a package.** * Note - uses quite a bit more memory than (link #open(String)}, which* doesnt need to hold the whole zip file in memory, and can take advantage* of native methods* *aparam in** The InputStream to read the package from* * return A PackageBase object* * * throws InvalidFormatException* * Throws if the specified file exist and is not valid. * * throws IOException If reading the stream fails */public static OPCPackage open(InputStream in) throws InvalidFormatException,IOException {OPCPackage pack new ZipPackage(inPackageAccess.READ_WRITE);try {if (pack.partList nul1) {(pack.getParts();}}catch (InvalidFormatException RuntimeException e) {IOUtils.close0uietly(pack);throw e;} return pack; }这行代码的注释中说了这个方法会把整个压缩文件都加载到内存中。也就是把整个 Excel 文档加载到内存中可想而知这在处理大型文件时是肯定会导致导致内存溢出的。 也就是说我们使用的XSSFWorkbook (包括HSSFWorkbook也同理) 在外理Excel的过程中会将整个Excel都加载到内存中在文件比较大的时候就会导致内存溢出。 ✅ 二、拓展知识仓 ✅2.1 几种Workbook格式 POI中提供了很多种Workbook API来操作Excel有的适合大文件读写有的不适合。 SSFWorkbook 用于处理Excel的.xsl格式即Excel 97-2003。 XSSFWorkbook 用于处理 Excel 的.xlsx 格式即 Excel 2007 及以后版本的支持更大的数据集和更多的功能如更好的样式和公式支持。但是相对于HSSFWorkbook它在处理大数据集时可能占用更多内存。 SXSSFWorkbook 用于处理xlsx 格式。它是 XSSFWorkbook 的流式版本专门设计用于处理大数据集。通过将数据写入临时文件而非全部保留在内存中显著减少内存消耗。特别适合用于创建大型数据集的 Excel 文件。 ✅2.2 SXSSFWorkbook是什么 SXSSFWorkbook是Apache POI库中的一个类用于处理大型Excel文件的写入特别是当数据量可能非常大以至于无法全部装入内存时。它是XSSFWorkbook的一个流式streaming版本主要用于生成大数据量的Excel文件.xlsx格式。 SXSSFWorkbook的工作原理是它只会将最新的几行数据这个数量是可配置的保存在内存中。当新的行被添加到工作表时最旧的行将被写入到磁盘上的临时文件中并从内存中删除。这样SXSSFWorkbook可以用有限的内存处理几乎无限的数据量。 需要注意的是一旦数据被写入到磁盘上的临时文件中就不能再修改这些数据。此外由于SXSSFWorkbook使用了流式写入技术它的写入速度可能会受到磁盘速度的影响。 总的来说如果你的应用程序需要生成大数据量的Excel文件并且你担心内存溢出的问题那么SXSSFWorkbook可能是一个很好的选择。 ✅2.3 SXSSFWorkbook有哪些优点和缺点 SXSSFWorkbook是Apache POI库中的一个类用于以流方式处理Excel文件的写入特别是针对无法全部装入内存的大数据量场景。以下是SXSSFWorkbook的主要优点和缺点 优点 内存友好SXSSFWorkbook使用了一种基于硬盘的临时存储方式将数据写入临时文件而不是将所有数据存储在内存中。这使得它可以处理非常大的数据集而不会导致内存溢出。高性能由于SXSSFWorkbook使用了临时文件存储数据它可以有效地处理大量的数据。它避免了在内存中处理大量数据所带来的性能问题。低内存占用相较于XSSFWorkbookSXSSFWorkbook在处理大型数据集时占用的内存更少。这使得它在处理大数据量时表现更好。 缺点 模板限制SXSSFWorkbook不支持使用现有的XLSX文件作为模板因为它是基于流式写入的无法预先加载整个模板文件到内存中。因此它不能使用模板打印。IO操作开销在写磁盘过程中SXSSFWorkbook可能会消耗较多的IO操作时间。这可能导致内存中产生很多对象但原来的对象可能还没有完整写入磁盘中。功能限制相比XSSFWorkbookSXSSFWorkbook在某些高级功能方面可能有所限制例如复杂的样式或公式支持可能不完全相同。另外因为它使用到了硬盘当数据到达硬盘以后无法完成数据的克隆或者公式计算sheet.clone()等方法已经无法被支持。 这些优缺点可能会随着Apache POI库的更新而发生变化。在使用SXSSFWorkbook时建议查阅最新的官方文档以获取最准确的信息。
http://www.zqtcl.cn/news/916930/

相关文章:

  • html网站建设流程网站模板二次开发
  • wordpress建站需要学什么意思sem扫描电镜
  • 总结 设网站门户网站开发一般多少钱
  • 政务网站无障碍建设wordpress虚拟资源主题
  • 确山专业网站建设百度一下一下你就知道
  • 设计类网站排名优秀广告案例
  • 自己做网站如何挣钱天津南开做网站
  • 小型教育网站的开发建设论文前端开发培训哪里好
  • 久免费域名注册网站朋友圈广告推广
  • 深圳著名设计网站西安管控最新消息
  • 珠海网站快速排名提升ftp查看网站后台密码
  • php电子商务网站源码百搜网络科技有限公司
  • 做外贸的网站怎么建立小说网站流量怎么做
  • 官网整站优化四川省造价工程信息网
  • 公司内部网站怎么建立网站建设与管理ppt
  • 做正规网站有哪些前端好学吗需要学多久
  • 1企业网站案例用自己服务器做网站用备案
  • 广州做啊里巴巴网站多少钱自贡公司做网站
  • 天津做家政的网站购物网站功能模块图
  • 哪个网站好网站赚钱的方式
  • 班级网站建设开题报告在线音乐网站开发摘要
  • 昆山装饰公司网站建设wordpress olve
  • 重庆哪个区最繁华百度seo排名规则
  • 长春火车站高清图片网站商城微信支付宝支付宝支付接口
  • 市场体系建设司在官方网站支付宝手机网站支付
  • dedecms 模版网站网站图标下载
  • 余姚 做网站北京南站
  • 腾讯建设网站视频视频视频中国建筑信息平台
  • 关于政务网站建设的调查问卷搜狗网页版
  • 网站开发工程师优势宁波seo网站