java - 25k 用户后的大数据处理堆栈

标签 java linux performance recommendation-engine bigdata

我有一个包含 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 用户正在为他们计算结果。

有关该算法如何工作的更多详细信息。

  1. 针对目标用户
  2. 对于目标用户附近的所有其他用户

    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/

相关文章:

java - 如何使用设置中的 if 语句更改背景颜色?

java - PouchDB 使用 Windows Java 开发

linux - 如何确定是否有任何接口(interface)正在监听给定的 IP 地址?

linux - 线程池中的段错误

c# - 添加参数的两种情况有什么区别?

php - Laravel 5 批量插入关系

java - 有人可以向我解释一下在 Java 中为什么 0.6 <0.6f 但 0.7is >=0.7f

java - 如何使用合并函数将元素添加到 HashMap<K, List<V>>

linux - 子进程不会在 Jenkins 环境中死亡

MySQL InnoDB VARCHAR 性能与插入时的 TEXT