项目中需要用到ES,在写完接口后,对ES进行测试时,需要导入100万,400万,500万数据,分三次导入。在用java代码导入时,100万数据用时40分钟。后边还有两次400万和500万的数据导入。所以利用多线程提高导入效率。
我本地机器测试时,线程池的大小设为100时,性能最佳。
导入100万数据时单线程写法:
导入耗时:
2439796毫秒=2439.7秒=40.7分钟
下边是导入400万数据多线程写法:
class IntoESTask implements Runnable{
private ElasticsearchTemplate elasticsearchTemplate;
private int index;
public IntoESTask(ElasticsearchTemplate elasticsearchTemplate, int index) {
super();
this.elasticsearchTemplate = elasticsearchTemplate;
this.index = index;
}
@Override
public void run() {
News a = new News();
a.setTitle("结构化数据性能测试");
a.setTag("tag");
a.setPublishTime("2020-02-24T13:34:00Z");
try {
elasticsearchTemplate.save(a);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"执行了第"+index+"任务");
}
}
@Test
public void testCustomSaveBigData() throws Exception{
init2();
StopWatch stopwatch = new StopWatch();
stopwatch.start();
ExecutorService pool = Executors.newFixedThreadPool(100);
for (int i = 0; i < 4000000; i++) {
pool.execute(new IntoESTask(elasticsearchTemplate, i));
}
pool.shutdown();
while(!pool.isTerminated()){
//等待所有任务完成
}
stopwatch.stop();
System.out.println(stopwatch.getTime()/1000);
}
利用多线程后,导入用时:
2933秒大约是48.9分钟。