马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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%以上
|