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

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%以上

相关文章:

  • LangFlow和LangChain有什么区别
  • 大数据SQL调优专题——Flink执行原理
  • Web3 通识
  • 解锁外观模式:Java 编程中的优雅架构之道
  • TortoiseSVN\bin下的没有svn.exe的解决问题
  • Linux的基础指令和环境部署,项目部署实战(下)
  • pyinstaller打包报错:INTEL MKL ERROR: 找不到指定的模块。 mkl_intel_thread.dll.
  • linux 安装启动zookeeper全过程及遇到的坑
  • C++ 模拟真人鼠标轨迹算法 - 防止游戏检测
  • 启元世界(Inspir.ai)技术浅析(七):AI Beings 平台
  • Nginx下proxy_redirect的三种配置方式
  • 【系列教程】Python第四课:条件判断 | 让程序学会思考的秘密
  • UE求职Demo开发日志#33、34 优化#2 删没用的场景和优化UI
  • 浅谈模组-相机鬼像
  • blender笔记2
  • Leetcode 3453. Separate Squares I
  • MISRA C vs CERT C 是两种广泛使用的 C 语言编码规范对比介绍
  • RabbitMQ服务异步通信
  • 修改时无条件,可以自定义id条件(通过查询)
  • C++ Primer 访问控制与封装
  • 首次公布!我国空间站内发现微生物新物种
  • 海昏侯博物馆展览上新,“西汉帝陵文化展”将持续展出3个月
  • 贵州省委军民融合发展委员会办公室副主任李刚接受审查调查
  • 新片|《碟中谍8:最终清算》定档5月30日
  • 上海市税务局:收到对刘某某存在涉税问题的举报,正依法依规办理
  • 科普|男性这个器官晚到岗,可能影响生育能力