r - 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
之后什么都没有。我最好的猜测是涉及到一些竞争条件。我该如何解决它,比如声明一个关键部分?
解决方案
- 在循环内增长对象非常慢(参见https://privefl.github.io/blog/why-loops-are-slow-in-r/)。
- 当你使用并行性时,你不会
rbind()
在master
你的全局环境中,而是在你的不同分支中的一些副本(参见https://privefl.github.io/blog/a-guide-to-parallelism-in -r/ )。 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)
推荐阅读
- excel - 将 Visual Basic 编辑器的语言更改为英语
- css - 使用 CSS 更改 JavaFX 中 TreeView 的样式
- python - 带有 Python 文件的 Crontab (Centos7)
- android - Android:如何从 AsyncTask 获取布尔结果?
- php - Symfony 独白系统日志格式化程序
- javascript - 如何将 Django 变量传递给 Javascript
- javascript - XSS : $sce.trustAsHtml 执行'onerror' js 代码
- dns - 我如何知道域注册商锁定的状态
- firebase - 使用 startAfter 进行 Flutter Firestore 查询
- python - 如何从文本文档中去除 \x00 字节