Poi读取大数据量Excel文件
前言
最近生产环境有个老项目一直内存报警,不时的还出现内存泄漏,导致需要重启服务器,已经严重影响正常服务了。
分析
1.dump内存文件
liunx使用如下命令:
?
1 |
|
2.使用Eclipse Memory Analysis进行分析
异常如下:
?
1 2 3 4 5 6 7 |
|
POI在加载Excel引发了内存泄漏,中间创建了大量的对象,占用了大量的内存
3.查看上传的Excel大小
经查看发现很多Excel大小在9M的文件
4.查看代码POI读取Excel的方式
发现使用的是用户模式,这样会占用大量的内存;POI提供了2中读取Excel的模式,分别是:
- 用户模式:也就是poi下的usermodel有关包,它对用户友好,有统一的接口在ss包下,但是它是把整个文件读取到内存中的,
对于大量数据很容易内存溢出,所以只能用来处理相对较小量的数据; - 事件模式:在poi下的eventusermodel包下,相对来说实现比较复杂,但是它处理速度快,占用内存少,可以用来处理海量的Excel数据。
经上面分析基本可以确定问题出在使用POI的用户模式去读取Excel大文件,导致内存泄漏。
本地重现
下面模拟一个600kb大小的Excel(test.xlsx),分别用两种模式读取,然后观察内存波动;
1.需要引入的库maven:
?
1 2 3 4 5 6 7 8 9 10 11 12 |
|
2.用户模式代码如下:
?
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
3.事件模式代码如下:
?
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
具体代码来源:http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api
4.设置VM arguments:-Xms100m -Xmx100m
UserModel运行结果直接报OutOfMemoryError,如下所示:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
UserModel模式下读取600kbExcel文件直接内存溢出,看了600kbExcel文件映射到内存中还是占用了不少内存;EventModel模式下可以流畅的运行。
5.设置VM arguments:-Xms200m -Xmx200m
UserModel模式和EventModel模式都可以正常运行,但是很明显UserModel模式回收内存更加频繁,而且在cpu的占用上更高。
总结
通过简单的分析以及本地运行两种模式进行比较,可以看到UserModel模式下使用的简单的代码实现了读取,但是在读取大文件时CPU和内存都不理想;
而EventModel模式虽然代码写起来比较繁琐,但是在读取大文件时CPU和内存更加占优。
Poi读取大数据量Excel文件相关推荐
- POI3.8解决导出大数据量excel文件时内存溢出的问题
POI3.8解决导出大数据量excel文件时内存溢出的问题 参考文章: (1)POI3.8解决导出大数据量excel文件时内存溢出的问题 (2)https://www.cnblogs.com/feng ...
- SAP ABAP 探索 CL_FDT_XL_SPREADSHEET 读取大数据量 Excel 的可能性
SAP ABAP 探索 CL_FDT_XL_SPREADSHEET 读取大数据量 Excel 的可能性 引言: 今时不同往日了,特别是在电商和零售行业中,动不动一个导入的 Excel 就有几十万行几十 ...
- 对大数据量Excel文件自动排版、转换成PDF用于印刷出版
excel排版大师 下载 http://pan.baidu.com/s/1eQnY0hW 2015.3. 目录 一.主要功能 2 二.系统需求 3 三.文件名要求 3 四.目录说明: 4 1.Exc ...
- POI读写超大数据量Excel,解决超过几万行而导致内存溢出的问题(附源码)
来源:cnblogs.com/swordfall/p/8298386.html 1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是 ...
- 大数据量Excel Import导致OOM问题
http://www.iteye.com/topic/199061 正在做一个Excel import的东东,不知道论坛上用POI的朋友有没有考虑过大数据量Excel文件导入导致内存溢出的问题 HSS ...
- Laravel 使用PHP_XLSXWriter实现大数据量Excel导出
我在去年写过一篇关于laravel的Excel导出文章:Laravel Excel 实现 Excel/CSV 文件导入导出功能,使用的是Laravel Excel实现的. 该扩展包含Excel导入导出 ...
- QT 利用QAxObject大数据读写excel文件
不知不觉已经加入CSDN很久了,但从来没有发过文章,最近开发了一个小工具踩了很多坑,主要是QT操作大数据Excel文件,现在和大家分享一下. 查阅了大部分资料,大数据读写excel文件用QAxObje ...
- Java操作大数据量Excel导入导出万能工具类(完整版)
Java操作大数据量Excel导入导出万能工具类(完整版) 转载自:https://blog.csdn.net/JavaWebRookie/article/details/80843653 更新日志: ...
- MYSQL数据库导入大数据量sql文件失败的解决方案
最快办法:执行下方语句,单次有效. SET GLOBAL max_allowed_packet=30*1024*1024 如果想彻底更改,在安装mysql的文件夹下找到my.ini 文件,在文件末尾添 ...
最新文章
- 框架退出的方法_AOP日志框架实现
- Hadoop编程调用HDFS
- java内部类的作用
- python爬取糗事百科
- 05精益敏捷项目管理——超越Scrum
- golang学习和使用经验总结
- 从dig命令理解DNS
- “抖音群控系统”教你如何抓住短视频时代风口,进行流量红利变现
- 用java 把字符串写进文本,Java将字符串写入文本文件代码示例
- VC资源编辑器里对话框的大小和实际的像素尺寸显示问题
- python3魔法方法_Python3 魔法方法详解
- 信息检索与利用(第三版)第三章信息素养
- ubuntu运行Openvino出现 ModuleNotFoundError: No module named ‘openvino.model_zoo.model_api‘解决
- STM32电子钟万年历Proteus仿真_LCD1602显示
- 计算机水平毕业研究生7分落户,研究生毕业如何进行上海积分落户?
- 什么是红黑树(内存最优的二叉树)
- RBM-MHC: A Semi-Supervised Machine-LearningMethod for Sample-Specific Prediction of AntigenPresent
- 仓库管理系统(WMS)有哪些好处?
- iview组件引入vue项目
- 超简单的React项目打包后部署到服务器上