当前位置: 首页 > 知识库问答 >
问题:

使用parallelStream和forEach的Java并行化,其中每个部分都是完全独立的

皮安顺
2023-03-14

然后对于每个第j个分类器,确定标签:labels[1..k](也并行)

将标签[1..k]的结果投票给单个decided_label,并将其与true_label进行比较

然后对于j=1:k,应用分类器[j].update(new_data_elem[j],decided_label==true_label)(更新需要知道预测是否正确)(同样,并行)

Set<Integer> set_of_index = new HashSet<>();
for (int j = 0; j < K; j++){
        set_of_index.add(j); // For parallelization 
}  
for (int t = 0; t < n; t++){
        true_label = true_labels[t];
        ... // make new_data_elem[1..K] 
        set_of_index.parallelStream().forEach((j)->{ 
              // Predict
              labels[j] = classifiers[j].predict(new_data_elem[j]);
        }
        ... // using labels[j] to predict decided_label        
        set_of_index.parallelstream().forEach((j)->{
              // Update
              classifiers[j].update((new_data_elem[j],decided_label == true_label);
        }
}

少数流操作,如forEach()和peek(),只能通过副作用进行操作;这些应该小心使用。

,所以我不太确定:(

共有1个答案

岳嘉良
2023-03-14

修改数组元素不会干扰对不同数组元素的并发修改,因此,假设计算不会干扰,代码似乎是正确的。

但是有一些专用的API方法使代码更加清晰:

for (int t = 0; t < n; t++){
        true_label = true_labels[t];
        // make new_data_elem[1..K] 
        Arrays.parallelSetAll(labels, j -> classifiers[j].predict(new_data_elem[j]));
        // using labels[j] to predict decided_label        
        IntStream.range(0, K).parallel().forEach( j ->
            classifiers[j].update(new_data_elem[j], decided_label == true_label));
}

arrays.ParallelSetAll被设计为写入每个数组元素,从而更容易推断这些数组写入之间不会有干扰。通过使用intstream.range(0,K),可以完全删除set_of_index

 类似资料:
  • 有一次,我被印上了“祝贺”,有一次,我被印上了“站台”。

  • 问题内容: 我正在尝试从python启动一个完全独立的进程。我不能使用像os.startfile这样的简单内容,因为我需要传递参数。目前,我正在使用subprocess.popen,它可以让我90%地到达那里。 将带有分离的创建标志和管道的popen用于std *确实会启动一个新进程,该进程在父进程死后仍然存在。这样就很好。问题在于,新的“子级”进程仍然为父级保留一个幻像句柄。因此,如果我尝试卸载

  • 问题内容: 在ElasticSearch中,我尝试使用带有模糊性的edge_ngram获得正确的评分。我希望精确匹配具有最高的分数,而子匹配具有较低的分数。以下是我的设置和评分结果。 在执行了名字为“ Michael”的POST之后,我进行了如下查询,并更改了“ Michael”,“ Michae”,“ Micha”,“ Mich”,“ Mic”和“ Mi”。 我的成绩是: 如您所见,得分结果没有

  • 我有一个使用RabbitMQ构建的发布-订阅场景。有一个交换,其中消息由发布者发送,订阅该交换的任何使用者在其各自的队列中接收这些消息。这是一个扇出场景,其中有一个生产者,但有多个消费者。 现在我愿意在系统中集成一个死信队列,以便稍后处理被拒绝的消息。我的问题是 1)我应该为每个使用者配置一个单独的死信队列,还是应该有一个单独的死信队列来处理来自所有使用者的所有被拒绝的消息? 2)如果两者都有可能

  • 问题内容: 我正在开发一个用Java编写的程序,对于某些操作,它使用用户配置的命令行启动外部程序。当前它使用并且不保留引用(启动的程序是文本编辑器或存档实用程序,因此不需要系统输入/输出/错误流)。 但是,这有一个小问题,即当Java程序退出时,直到所有启动的程序都退出后,它才真正退出。 如果启动的程序完全独立于启动它们的JVM,我将更喜欢它。 目标操作系统是多个,最低要求是Windows,Lin

  • 我在R包中使用函数进行并行计算。除了这个函数之外,我认为还需要在包中使用函数。 但是,当我编写文件时,部分包含,但是当我运行代码时,错误指示:无法找到函数。因此,我还