R中的平行包装的竞争状况

时间:2019-02-03 12:49:44

标签: r parallel-processing vectorization race-condition critical-section

我正在尝试对向量并行执行具有副作用的函数。例如,在以下代码段中,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之后没有任何内容。我最好的猜测是其中涉及一些比赛条件。我该如何解决,例如可能声明一个关键部分?

1 个答案:

答案 0 :(得分: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/)。 / li>
  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)