首页 > 解决方案 > R中并行包的竞争条件

问题描述

我正在尝试并行执行一个对向量有副作用的函数。例如,在以下代码段中,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]] ab 1 1 0.841471

[[2]] ab 1 2 0.9092974

[[3]] ab 1 3 0.14112

[[4]] ab 1 4 -0.7568025

但是,master之后什么都没有。我最好的猜测是涉及到一些竞争条件。我该如何解决它,比如声明一个关键部分?

标签: rparallel-processingvectorizationrace-conditioncritical-section

解决方案


  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)

推荐阅读