R中并行包的竞争条件
我试图并行执行一个对向量有副作用的函数。例如,在下面的代码段中,R中并行包的竞争条件,r,parallel-processing,vectorization,race-condition,critical-section,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) 库(并行) 主人 在循环
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)
库(并行)
主人
在循环中生长对象非常缓慢(参见)
当您使用并行时,您不会在全局环境中对master
执行rbind()
,而是在不同的fork中执行它的一些副本(参见)
mclappy
已经返回了一些内容(比如lappy
)李>
你可以简单地做
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)
库(并行)
add.entry您的函数不是在修改master。例如,尝试添加条目(1)
,然后打印母版。它不会被改变。@lmo这很有趣。。。但是,直接执行语句确实会向master
添加一行。知道发生了什么吗?在函数式编程范例中,不鼓励通过副作用修改对象的函数。函数中的主对象是函数的局部对象。R确实提供了一个工具来使用@lmo实现这一点,我会接受你的建议。但是,sapply(1:4,add.entry)
给出的结果是转置的,即a
和b
是行,但我希望它们是列。也许我可以用t
再次转置它。