与并行包中的R争用条件

问题描述 投票:0回答:1

我想在并行向量执行与副作用的功能。例如,在下面的代码段中,add.entry具有修改master的副作用。

library(parallel)

master <- data.frame()

add.entry <- function(x) {
  row <- data.frame(a = x, b = sin(x))
  master <- rbind(master, row)
}

mclapply(1:42, add.entry)

我得到的输出是

[[1]] A B 1 1 0.841471

[[2]] A B 1 2 0.9092974

[[3]] A B 1 3 0.14112

[[4] A B 1 4 -0.7568025

然而,master包含任何算账。我最好的猜测是,有一些涉及竞争状态。我怎样才能解决这个问题,如可能宣布一个重要的部分?

r parallel-processing vectorization race-condition critical-section
1个回答
1
投票
  1. 它是生长在一个循环中的物体非常缓慢(参见https://privefl.github.io/blog/why-loops-are-slow-in-r/)。
  2. 当您使用的并行性,你不rbind()在您的全球环境的master,但它在不同的叉子一些副本(参见https://privefl.github.io/blog/a-guide-to-parallelism-in-r/)。
  3. mclapply已返回的东西(如lapply)。

你可以简单地做

library(parallel)

add.entry <- function(x) {
  data.frame(a = x, b = sin(x))
}

res_list <- mclapply(1:42, add.entry)
master <- do.call("rbind", res_list)
© www.soinside.com 2019 - 2024. All rights reserved.