clusterExport到R并行中的单线程

时间:2015-06-26 08:17:34

标签: r multithreading parallel-processing bigdata

我想将一个大的data.frame拆分成块,并将每个单独传递给群集的不同成员。

类似的东西:

library(parallel)
cl <- makeCluster(detectCores())
for (i in 1:detectCores()) {
  clusterExport(cl, mydata[indices[[i]]], <extra option to specify a thread/process>)
}

这可能吗?

1 个答案:

答案 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)

有更简单的方法可以做到这一点,但是这个示例最大限度地减少了主服务器使用的内存和发送给每个工作人员的数据量。当数据帧非常大时,这很重要。