当前位置: 首页 > article >正文

POI优化Excel录入

57000+单词原始录入时间258S

核心代码:

List<Word> wordBookList = ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);
            if (!CollectionUtil.isEmpty(wordBookList)) {
                for (Word word : wordBookList) {
	//逐条向数据库中插入单词
                    wordMapper.insert(word);
                }
            }

线程池方式录入时间18S

核心代码:

//获取核心数
            int coreCount = Runtime.getRuntime().availableProcessors();
            //创建线程池
            ExecutorService executorService= Executors.newFixedThreadPool(2*coreCount);
            List<Word> wordBookList = ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);
            //对列表单词进行分区并发录入
            int partitionSize=wordBookList.size()/(2*coreCount);
            List<List<Word>> wordListPartition = Lists.partition(wordBookList, partitionSize);
            for (int i = 0; i <wordListPartition.size(); i++) {
                Runnable task=new ExcelInput(wordListPartition.get(i),wordMapper);
                executorService.execute(task);
            }
            executorService.shutdown();
	//阻塞当前线程,直到线程池中的任务执行完毕
            try {
                if(!executorService.awaitTermination(1, TimeUnit.HOURS)){
                    executorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();
            }

优化流程:

首先获取当前主机核心数N,因为大数据量单词录入属于IO密集型所以我们设置线程池的大小为2*N第二步我选择将List拆分为2*N接着放入线程池当中去执行单词录入任务基于此线程池中的多个线程可以对数据的录入进行并发操作大大提高了录入的效率

选择2*N的原因是代码中获取的核心数为物理核心数,而实际上主机可以利用超线程技术将一个物理核心当做两个逻辑核心来使用,当我们想让CPU利用率达到100%时就可以设置2*N个线程数并将单词分为2*N份交给线程池中的线程处理同时减少了线程的上下文切换所带来的损耗。

240/258=0.93

优化后单词录入效率提高90%以上


http://www.kler.cn/a/552365.html

相关文章:

  • Node.js 中 morgan 依赖详解
  • 使用iOS个人声音与SoVITS训练个人AI语音(10分钟快速上手)
  • Linux上部署Java项目-通过sh脚本启动
  • Day01 【苍穹外卖】环境搭建与前后端联调
  • MySQL 面试系列:MySQL 事务的面试题总结
  • 芯麦GC1808立体声ADC芯片解析:高性价比与全集成音频采集方案
  • 【Java】分布式锁Redis和Redisson
  • PHP Web 开发基础
  • [数据结构]红黑树,详细图解插入
  • AI时代的前端开发:机遇与挑战并存
  • 如何创建自定义权限的kubeconfig
  • Cursor助力Java开发
  • PHP本地商家卡券管理系统源码
  • DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
  • 等距节点插值公式
  • 统信服务器操作系统V20 1070A 安装docker新版本26.1.4
  • MySQL Workbench 8.0不支持非SSL连接
  • Low code web framework for real world applications, in Python and Javascript
  • Linux中进程的状态3 进程的优先级1
  • Unity 获取独立显卡数量