百万数据导出,居然爆炸了OutOfMemoryError?

news/2024/11/15 17:57:10/

一、问题的提出

/*** 大数据导出1.0* /demo/exportExcel4* @param response*/
@GetMapping("/exportExcel4")
public void exportExcel4(HttpServletResponse response) throws IOException {Date start = new Date();// 模拟数据List<UserExportVO> users = new ArrayList<>();for (int i = 0; i < 1000000; i++) {  //一百万数据量users.add(new UserExportVO("test-"+i,1,new         Date(),"18688888888","abc"+i+"@qq.com",null,"xxxx"));}ExcelUtil.exportExcelX(users, "测试导出表", "sheet1", UserExportVO.class, "测试导出表.xlsx", response);System.out.println("耗时:"+(new Date().getTime() - start.getTime())/1000+"秒");
}
 

导出耗时:115秒,导出文件大小:157M。

二、大数据导出

导出是能够与导出了,但是耗时太长了,有办法减半吗?导出文件大小太大了,能办法减半吗?

大数据导出是当我们的导出数量在几万,到上百万的数据时,一次从数据库查询这么多数据加载到内存然后写入会对我们的内存CPU都产生压力,这个时候需要我们像分页一样处理导出分段写入Excel缓解Excel的压力。

大数据导出主要是使用到了ExcelExportUtil.exportBigExcel的方法:

 

/*** 大数据导出2.0* /demo/exportExcel5* @param response*/
@GetMapping("/exportExcel5")
public void exportExcel5(HttpServletResponse response) throws IOException {Date start = new Date();Workbook workbook = null;ExportParams params = new ExportParams("大数据测试", "测试");workbook =         ExcelExportUtil.exportBigExcel(params, UserExportVO.class, new IExcelExportServer() {@Overridepublic List<Object> selectListForExcelExport(Object obj, int page) {if (((int) obj) == page) {return null;}List<Object> list = new ArrayList<Object>();for (int i = 0; i < 10000; i++) {//1页查询1万,总共100页,100万数据.list.add(new UserExportVO("test-"+i,1,new Date(),"18688888888","abc"+i+"@qq.com",null,"xxxxxx"));           }return list;}}, 100);ExcelUtil.downLoadExcel("大数据导出测试.xlsx",response,workbook);System.out.println("耗时:"+(new Date().getTime() - start.getTime())/1000+"秒");
}
 

难点就是接口IExcelExportServer的实现,底层会进行page++,不断的查找下一页,所以这里一定要有一段结束这个循环的逻辑。在实际项目中,更多的是查询的list的size()==0了。

page是从1开始的:

导出时间60秒左右,和刚刚的115秒,时间几乎少了一半。

 导出的文件的大小,从原来的157M,变为了28M,少了6倍左右。

当然这个第一次的导出方式,文件的大小,也和导出的配置有关系,在之前为了解决图片导出问题,设置了为ExcelType.HSSF。

如果设置为ExcelType.XSSF的格式直接就OutOfMemoryError: GC overhead limit exceeded了(这种情况发生的原因是,程序基本上耗尽了所有的可用内存, GC也清理不了)。

总结

对于大数据的导出,核心要注意的就是内存溢出了。

(1)100万的数据,使用ExcelType.XSSF的方式导出,会报错:OutOfMemoryError: GC overhead limit exceeded。

(2)100万的数据,使用ExcelType. HSSF的方式导出,能导出,耗时115秒左右,导出的文件大小157M左右。

(3)大数据的导出方式,能导出,耗时60秒左右,导出的文件大小28M左右。


http://www.ppmy.cn/news/114257.html

相关文章

linux系统命令

&#xff01;历史命令id 执行对应的指令 &#xff01;&#xff01; 执行上一次指令 正则&#xff1a; grep -i "root" a.txt -c 从a.txt中统计root的字符串的次数 grep -En \.$ luffy.txt 从a.txt中过滤以.结尾的行 cat -En a.tx…

【Python实战】Python采集热榜数据

前言 大家好,我们今天来爬取热搜榜,把其文章名称,链接和作者获取下来,我们保存到本地,我们通过测试,发现其实很简单,我们只要简单获取数据就可以。没有加密的东西。 效果如下: 环境使用 python 3.9pycharm模块使用 requests模块介绍 requests requests是一个很…

下载——百度文库下载方法

网址链接中的baidu后 vvv 只需现在百度文库找到自己需要的文档&#xff0c;在网址baidu后添加vvv&#xff0c;按回车键&#xff0c;即可快速跳转至解析页面。

下载各种百度文库以及豆丁网文章的简便方法

1、http://xiazai.zol.com.cn/detail/42/417000.shtml(下载冰点文库&#xff0c;并解压) 2、解压后的文件如下&#xff0c;打开文件夹 3、在文件夹中找到应用程序图标&#xff0c;如下&#xff0c;双击打开 4、需要下载的网址链接复制在下载框即可。

冰点下载-支持百度文库、道客巴巴、豆丁等主流文库平台文档下载

一个文档下载神器&#xff0c;有了它&#xff0c;就不用再开VIP了&#xff0c;亲测有效。软件界面如下&#xff1a;支持百度文库、道客巴巴、豆丁等主流文库平台文档下载&#xff0c;功能十分强大。 资源获取&#xff1a;冰点下载

百度文库,豆丁下载

支持百度、豆丁、丁香、畅享、MBALib、Book118等文库文档。微云​链接&#xff1a;链接&#xff1a;https://share.weiyun.com/5asdSeO 密码&#xff1a;nb733r 百度网盘​链接&#xff1a;https://pan.baidu.com/s/1l5ZUw1OlaWLhs2Y3XRkdVA 提取码: 6ruy 完毕&#xff01;&…

豆丁网word文档下载方法集锦

豆丁网word文档下载方法集锦 前段时间搞论文&#xff0c;需要下载论文文档&#xff0c;总结了一些方法&#xff1a; &#xff11;.抱米花下载器&#xff0c;网上找到的下载工具&#xff0c;只能把豆丁的文档以pdf格式的文件下载下来。 &#xff12;.在百度快照里面找到文档&am…

豆丁文档无需豆元直接下载

因为博主不能每日测试&#xff0c;希望朋友们使用后评论反馈一下&#xff0c;如果不能使用了博主再尝试其它途径。 豆丁下载神器&#xff1a;https://www.docin365.com/ 操作方法&#xff1a; a、将想要下载的豆瓣文档链接放入框中 下载即可 b、在docin后面加上365 例如http…