如何使用dplyr并行化do()调用
我试图弄清楚如何并行部署如何使用dplyr并行化do()调用,r,dplyr,R,Dplyr,我试图弄清楚如何并行部署dplyr::do函数。在阅读了一些文档之后,似乎dplyr::init_cluster()足以告诉do()并行运行。不幸的是,当我测试时,情况似乎并非如此: library(dplyr) test <- data_frame(a=1:3, b=letters[c(1:2, 1)]) init_cluster() system.time({ test %>% group_by(b) %>% do({ Sys.sleep(
dplyr::do
函数。在阅读了一些文档之后,似乎dplyr::init_cluster()足以告诉do()并行运行。不幸的是,当我测试时,情况似乎并非如此:
library(dplyr)
test <- data_frame(a=1:3, b=letters[c(1:2, 1)])
init_cluster()
system.time({
test %>%
group_by(b) %>%
do({
Sys.sleep(3)
data_frame(c = rep(max(.$a), times = max(.$a)))
})
})
stop_cluster()
如果do调用在两个内核之间进行拆分,我希望是3。我还可以通过在主R终端中打印的do()中添加一个打印来确认这一点。我错过了什么
我正在将dplyr 0.4.2与R 3.2.1一起使用,因为目前似乎不支持此功能 您可以查看哈德利的新软件包。根据@Maciej提到的,您可以尝试
multidplyr
:
## Install from github
devtools::install_github("hadley/multidplyr")
使用
partition()
library(dplyr)
library(multidplyr)
test <- data_frame(a=1:3, b=letters[c(1:2, 1)])
test1 <- partition(test, a)
然后只需执行do()
调用:
test1 %>%
do({
dplyr::data_frame(c = rep(max(.$a)), times = max(.$a))
})
其中:
#Source: party_df [3 x 3]
#Groups: a
#Shards: 3 [1--1 rows]
#
# a c times
# (int) (int) (int)
#1 1 1 1
#2 2 2 2
#3 3 3 3
我发现,对于真正关键的代码,最好的方法,至少对于我的用例来说,是用Rcpp和OpenMP弄脏你的手。这在很大程度上超出了我的计算机科学能力,但似乎有太多微妙的缓存交互,有时还有处理器或编译器的怪癖,所以需要仔细地分析和基准测试。我还发现,对数据进行良好的结构化通常会产生最大的差异,并且可以显著地帮助并行化。祝你好运谢谢研究了@Maciej的答案,很高兴终于找到了答案。我经常做比Summary中可用的任务更复杂的任务,如果没有并行化,我就无法真正找到像许多人声称的那样有用的dplyr。@MaxGordon很高兴它有帮助!如何将要使用do()
执行的用户定义函数发送到每个节点?我得到了“未找到函数”@Dominik你介意用一个可复制的例子发布一个新问题吗?我可以给它一个快照,如果您手动创建集群,看起来您可以使用parallel的clusterExport使用通常的方法来实现这一点:集群
test1 %>%
do({
dplyr::data_frame(c = rep(max(.$a)), times = max(.$a))
})
#Source: party_df [3 x 3]
#Groups: a
#Shards: 3 [1--1 rows]
#
# a c times
# (int) (int) (int)
#1 1 1 1
#2 2 2 2
#3 3 3 3