【发布时间】:2018-02-24 20:43:12
【问题描述】:
我正在遍历一个包含 +- 1500 个条目的字符串列表。在每次迭代中,我再次遍历字符串列表,但这次有 +- 3500 万个条目。应用的结果是完美的。但是应用程序需要很长时间(2 多个小时)才能给我结果。我应该如何构建多线程以使我的应用程序更快?
结果列表的顺序并不重要。
- 我是否应该将大列表(3500 万个条目)划分为更小的块并通过它们并行迭代? (如何确定完美的块数?)
- 我应该为小列表中的每个迭代启动一个线程吗? (这将创建 1500 个线程,我猜其中很多会“并行”运行)
我还有哪些其他选择?
代码表示:
List<String> result = new ArrayList<String>();
for(Iterator<String> i = data1.iterator();i.hasNext();){ //1500 entries
String val = i.next();
for(Iterator<String> j = data2.iterator();j.hasNext();){ //35 million entries
String test = j.next();
if(val.equals(test)){
result.add(val);
break;
}
}
}
for(Iterator<String> h = result.iterator();h.hasNext();){
//write to file
}
更新
在重构我的代码并实现 JB Nizet 给出的答案后,我的应用程序现在运行得更快了。现在只需 20 秒即可获得相同的结果!没有多线程!
【问题讨论】:
-
1500 条记录的哈希集...所以循环是 O(1)?
-
如何使用比列表更高效的东西,比如 HashSet 并在上面调用
contains? -
使用并行流
-
好吧,如果你启动 1k5 个线程,除非你有 1k5 个内核,否则它们中的很多会争抢资源,而且我认为它不会像你想象的那么快。
-
您的代码与您的描述不符。第二个数据来自哪里。每个val都一样吗?每个 val 的列表是否不同?
标签: java multithreading list concurrency hashset