EasyExcel导出大数据文件(100万条)_easyexcel导出百万数据

本文演示了如何使用EasyExcel分批导出100万条数据,通过多次写入和SQL优化减少内存占用。详细记录了查询和写入时间,提供了不同分页策略的性能对比。
摘要由CSDN通过智能技术生成

public void export5() {
       long t1 = System.currentTimeMillis();
       long query = 0;
       long write = 0;

       for (int i = 0; i < 10; i++) {
           String fileName = “写你自己准备存excel的文件夹路径” + “分页导出” + i + “.xlsx”;
           ExcelWriter excelWriter = EasyExcel.write(fileName, ExamItem.class).build();
           WriteSheet writeSheet = EasyExcel.writerSheet(“分页导出”).build();
           for (int j = 0; j < 10; j++) {
               long t3 = System.currentTimeMillis();
               // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
               QueryWrapper queryWrapper = new QueryWrapper<>();
               queryWrapper.last("limit " + (10 * i + j) * 10000 + “,10000”);
               List memberInfos = examItemService.list(queryWrapper);
               long t4 = System.currentTimeMillis();
               excelWriter.write(memberInfos, writeSheet);
               long t5 = System.currentTimeMillis();
               System.out.println(“一万条数据第”+i+“个文件的第”+j+“次查询时间:” + (t4-t3) / 1000D);
               System.out.println(“一万条数据第”+i+“个文件的第”+j+“次写入时间:” + (t5-t4) / 1000D);
               query += (t4-t3);
               write += (t5-t4);
          }
           excelWriter.finish();
      }

       long t2 = System.currentTimeMillis();
       System.out.println(“总耗时:” + (t2 - t1) / 1000D);
       System.out.println(“总查询耗时:” + query / 1000D);
       System.out.println(“总写耗时:” + write / 1000D);

  }


改动就是改成了两层循环,外层循环负责写入十次文件,内层循环负责每个文件写十次,每次写入1万条数据。




| 总耗时:55.701 |
| --- |
| 总查询耗时:29.27 |
| 总写耗时:16.3 |


写入时间进一步减少,但是查询时间再增加,总时间反而变的更多了。


而堆内存的使用量进一步降低,CPU基本没有明显变化。


![](https://img-blog.csdnimg.cn/01e63684b6ff4496baa8d5ca031c3220.png)




### 分成十个文件,每个文件分十次写入


easyexcel的官网给的简单写代码里有这么一行注释。



//在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入


于是有了思考,上面的方法虽然CPU占用很平稳,也不高,但是总时长却变长了。是不是因为easyexcel的单次写入性能性价比最高极限是5000条数据,所以,我们尝试把每次写入1万条数据再次拆分,变成每次写入5000条。


多次查询,多个文件,多次写入。100万条数据,分成10个文件,每个文件的10万条数据分20次写入,每次写入5千条数据



public void export6() {
       long t1 = System.currentTimeMillis();
       long query = 0;
       long w

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值