我有一个包含 28,000 个用户、60,000 个位置和 100 万条评论的数据集。我正在实现一个推荐系统,该系统会考虑用户的常见地点和常见价格,最终做出一些关于用户愿意去某个地点的程度的预测。
下面是我做的代码
HashMap<String, HashMap<String, Double>> user_locIDVisitsPredictions = new HashMap<>();
HashMap<String, HashMap<String, Double>> user_locIDRatesPredictions = new HashMap<>();
List<Future> tasks1 = new ArrayList<>();
ExecutorService executor1 = Executors.newFixedThreadPool(threads);
for(String me : wholeSetHistory.keySet()){
Runnable tokentask = new UserRun(wholeSetHistory, wholeSetRatings, lnglatStores2, user_locIDVisitsPredictions, user_locIDRatesPredictions, me, u);
u++;
tasks1.add(executor1.submit(tokentask));
}
executor1.shutdown();
boolean done1=false;
while(done1==false) {
done1=true;
for (int i=0; i<tasks1.size(); i++){
try{
Future future =tasks1.get(i);
if(future.get()!=null){
done1=false;
break;
}
}catch(Exception e){
System.out.println("sto future kollise ");
}
}
}
tasks1.clear();
Runnable tokentask 正在为一个用户执行流程以获取他的结果。我使用线程是因为我在一台不在的机器上运行实验,它运行在 Linux 操作系统上。我用 nohub 运行它。
现在是我的问题。在达到 25,000 名用户之前,该过程进展顺利。最后的 3k 用户正在为他们计算结果。
有关该算法如何工作的更多详细信息。
- 针对目标用户
对于目标用户附近的所有其他用户
2.1 获取他去过的位置并与目标用户比较
2.2 获取他的完成率并与目标用户比较
2.3 求同存异
2.4 做出预测
为什么这个过程在 25k 用户之后变得非常缓慢?
感谢您的宝贵时间!
最佳答案
我会使用更少的任务。我猜 wholeSetHistory
是 1m 集合,但是每个 CPU 只需要 1 到 2 个任务。幸运的是,有一个内置库可以为您完成这项工作。
List<Result> results = wholeSetHistory.entrySet().parallelStream(e ->
new UserRun(e.getValue(), wholeSetRatings, lnglatStores2,
user_locIDVisitsPredictions, user_locIDRatesPredictions, e.getKey())
.result())
.collect(Collectors.toList());
这将大大减少您一次创建的对象数量,并且代码也简单得多。您也没有繁忙的等待线程消耗 CPU。
关于java - 25k 用户后的大数据处理堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37746020/