我想将一个大的data.frame
拆分成块,并将每个单独传递给群集的不同成员。
类似的东西:
library(parallel)
cl <- makeCluster(detectCores())
for (i in 1:detectCores()) {
clusterExport(cl, mydata[indices[[i]]], <extra option to specify a thread/process>)
}
这可能吗?
答案 0 :(得分:3)
这是一个在clusterCall
循环中使用for
向每个工作人员发送不同数据框块的示例:
library(parallel)
cl <- makeCluster(detectCores())
df <- data.frame(a=1:10, b=1:10)
ix <- splitIndices(nrow(df), length(cl))
for (i in seq_along(cl)) {
clusterCall(cl[i], function(d) {
assign('mydata', d, pos=.GlobalEnv)
NULL # don't return any data to the master
}, df[ix[[i]],,drop=FALSE])
}
请注意,对clusterCall
的调用是cl
的子集,以便每次通过for
循环对单个工作程序执行该函数。
您可以使用以下命令验证工作人员是否已在此示例中正确初始化:
r <- do.call('rbind', clusterEvalQ(cl, mydata))
identical(df, r)
有更简单的方法可以做到这一点,但是这个示例最大限度地减少了主服务器使用的内存和发送给每个工作人员的数据量。当数据帧非常大时,这很重要。