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