首页 > 其他分享 >导入Excel大量数据如何优化

导入Excel大量数据如何优化

时间:2024-07-13 19:56:12浏览次数:8  
标签:set 数据库 Excel 插入 导入 new QydjQydjxx 优化

导入Excel大量数据如何优化

背景

线上导入excel 的时候发现速度太慢了 发现原来的代码 是 读入所有数据
然后按行去数据库比对是否存在,不存在再插入。 这样就相当于 n 条数据 要有 2n 次的数据库请求,以前数据量小的时候没问题,数据量一大就暴露出问题了,
下面的测试在 数据库中有20w条数据时导入6k条进行

原代码

excelDataList.stream().forEach(gt -> {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(QydjQydjxx::getQymc, gt.getQymc()).or().eq(QydjQydjxx::getTyshxydm, gt.getTyshxydm());
List gtdjxxList = list(wrapper);
if (CollectionUtils.isNotEmpty(gtdjxxList)) {
fails.add(gt.getQymc() + " 已存在");
}
else {
QydjQydjxx gtdjxx = new QydjQydjxx();
BeanUtils.copyProperties(gt, gtdjxx);
save(gtdjxx);
}

优化思路

判断主要时间花费就在数据库IO上 然后就开始着手代码优化 思路方向就是减少与数据库的交互次数
刚开始的方案就是 把在数据库里进行的判断拿到内存中去判断,这样的话只需要查一次、存一次即可

准备冻手!!-- 减少与数据库的网络IO

   /**
     * 将企业名称和统一社会信用代码放在set中作为缓存
     * 避免每行excel数据都去查询数据库判断是否存在
     * @return 企业名称和统一社会信用代码的集合
     */
    private Set<String> getExistingQymcAndTyshxydm() {
        LambdaQueryWrapper<QydjQydjxx> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(QydjQydjxx::getQymc, QydjQydjxx::getTyshxydm);
        List<QydjQydjxx> list = qydjQydjxxMapper.selectList(queryWrapper);
        Set<String> set = new HashSet<>(list.size());
        list.stream().forEach(qydjQydjxx -> {
            set.add(qydjQydjxx.getQymc());
            set.add(qydjQydjxx.getTyshxydm());
        });
        return set;
    }

这里有一个潜在的问题不知道眼尖的同学能不能发现。

就这样写好后与前端进行测试,发现还是会很慢,这个时候已经想到是内存问题了,当时写就想着偷懒用mp直接查实体再取出来,接下来继续优化。

继续优化 – 降低数据占用内存

我们只需要把 企业名称和统一社会信用代码放在set里 没必要用实体接收。稍微计算一下40w长度的String数组的大小,每个String假定长度为10,

gpt
40w的话大概大小为20MB
接下来继续比对测试

用实体接收


在这里插入图片描述

用String接收

   private Set<String> getExistingQymcAndTyshxydm() {
         List<String> qymcList = qydjQydjxxMapper.selectAllQymc();
        List<String> tyshxydmList = qydjQydjxxMapper.selectAllTyshxydm();
        Set<String> set = new HashSet<>(qymcList.size()+tyshxydmList.size());
        set.addAll(qymcList);
        set.addAll(tyshxydmList);
        return set;
    }

在这里插入图片描述
在这里插入图片描述
结果显而易见,优化到现在差不多够线上使用了。

后续优化-- 数据库插入优化 + 多线程

后续我在测试导入大数据量的excel文件时,经常抛出这个警告,有时候还会导入失败

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@f4a8cbf] 
Transaction not enabled

在搜索了相关资料后了解到是数据库插入相关问题,一次性插入过多数据,数据库服务器处理不过来,接下来继续优化

关于数据库插入优化有两方面

  1. 怎么插入,使用批处理(mp的saveBatch)还是 foreach标签
  2. 多少条数据插一次比较好

这里直接说我使用的了,想了解具体的可以去搜

  1. 使用的批处理,数据库配置时加rewriteBatchedStatements=true
  2. 网上看别人测的是1000条,同时 mp的 saveBatch默认也是1000条
    在这里插入图片描述
    然后使用线程池去进行插入
// 继承 ReaderListener类 读完 excel 后进行的操作
 @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        List<List<QydjQydjxx>> streamList = new ArrayList<>();
        for (int i = 0; i < qydjqydjxxList.size(); i += BATCH_COUNT) {
            int j = Math.min((i + BATCH_COUNT), qydjqydjxxList.size());
            List<QydjQydjxx> subList = qydjqydjxxList.subList(i, j);
            streamList.add(subList);
        }
        log.info("插入数据");
      streamList.parallelStream().forEach(qydjxxService::saveBatch);
    }

到此 我能想到的优化已经做完了!

总结

  • 大部分的优化都是减少与数据库的 IO 时间,这方面我们可以通过 加 缓存 来将 判断转移在 jvm 中进行,多线程 + 批处理 加快插入速度
  • 细节上要注意 内存 的开销,减少没有必要的对象的创建。

如果还有更好的优化思路请指教!

参考文章

10w+ Excel 数据导入,怎么优化?

标签:set,数据库,Excel,插入,导入,new,QydjQydjxx,优化
From: https://blog.csdn.net/m0_72618948/article/details/140374080

相关文章

  • PowerQuery 汇总系列 - 单个Excel工作薄文件、多工作表
    文章目录1.写在前面,多工作表汇总也有坑2.删除自动生成的步骤,重新开始3.删除自动生成的步骤,开始改写4.指定工作表汇总4.1.按单个关键词4.2.按多个关键词Authors@樊笼星海@w180361@Email:[email protected].写在前......
  • 【转发收藏】电力系统优化调度方向热点研究方向推荐及参考文献,创新点立马就有了!
     【转发收藏】电力系统优化调度方向热点研究方向推荐及参考文献,创新点立马就有了!(qq.com)专题推荐:论文推荐,代码分享,典藏级代码,视角,论文思路,免责声明(点击即可跳转)高创新组合模型和算法典藏级matlab代码,又双叒叕更新啦!(电力系统优化和时间序列预测方向)倾情推送24.7.6【代码......
  • 探索贪心算法:解决优化问题的高效策略
    贪心算法是一种在每一步选择中都采取当前最佳选择的算法,以期在整体上达到最优解。它广泛应用于各种优化问题,如最短路径、最小生成树、活动选择等。本文将介绍贪心算法的基本概念、特点、应用场景及其局限性。贪心算法的基本概念贪心算法的核心思想是局部最优策略,即在每一步选择......
  • CCS工程导入后编译时无法读取头文件的问题
    CCS工程导入后编译时无法读取头文件的问题,主要是由移植之后的文件搜索路径所指向的文件夹不存在导致的。有两种解决办法:①导入工程时将所需要的所有.h、.c以及.lib文件一并打包在工程文件中,复制到Workspace并重新选取搜索路径;②导入工程的电脑安装有C2000WARE,修改CCS中相对路径......
  • 2024 辽宁省大学数学建模竞赛B 题 钢铁产品质量优化完整思路 代码 结果分享(仅供学习)
    冷轧带钢是钢铁企业的高附加值产品,其产品质量稳定性对于钢铁企业的经济效益具有非常重要的影响。在实际生产中,冷连轧之后的带钢需要经过连续退火处理来消除因冷轧产生的内应力并提高其机械性能。连续退火的工艺流程如图1所示,一般包括加热、保温、缓冷、快冷、过时效、淬火等......
  • 用python处理excel数据
    1.小技巧:用print()检查代码,可以把想检查的变量作为参数放进括号内打印出来,便于检查2.第三方库:1.xlrd读取excel文件。 2.xlwt写入excel文件。 3.xlutils一组excel高级操作的工具3.xlrd包含四个功能:1.读取有效单元格的行数和列数。2.读取指定行或列所有单元格的值。3.读取......
  • 基于ACO蚁群优化算法的WSN网络路由优化matlab仿真
    1.程序功能描述      基于ACO蚁群优化算法的WSN网络路由优化,通过蚁群优化迭代,在WSN中搜索一个最短的路由路径。在仿真过程中,实时显示每一次迭代过程中找到的路径,最后输出ACO的优化迭代过程,网络路由路径的搜索结果。 2.测试软件版本以及运行结果展示MATLAB2022a版本运......
  • SQL优化-索引
    什么是索引?索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。索引的特点:索引结......
  • DP优化技巧-斜率优化(基础版)
    DP优化技巧-斜率优化(基础版)基本思路:1.寻找出暴力DP转移方程式。例子:f[i]=min{f[j]+v[i]+v[j]+val(i,j)}2.将方程式写成y=kx+b的形式,其中b为与i相关的项,y为与j相关的项,kx对应的是val(i,j)项,其中x对应的的是与j相关的,k对应的是与i相关的以及常数。例子:假设有转移方程f[i]=min{f[......
  • 大厂性能优化的10大顶级方案 (万字图文史上最全)
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......