clusterExport到R并行中的单线程

clusterExport to single thread in R parallel

我想将一个大 data.frame 拆分成多个块,然后分别将每个块传递给集群的不同成员。

类似于:

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

这可能吗?

下面是一个示例,它在 for 循环中使用 clusterCall 向每个工作人员发送不同的数据帧块:

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 循环在单个 worker 上执行该函数。

您可以使用以下方法验证此示例中的工作人员是否已正确初始化:

r <- do.call('rbind', clusterEvalQ(cl, mydata))
identical(df, r)

有更简单的方法可以做到这一点,但这个例子最大限度地减少了 master 使用的内存和发送给每个 worker 的数据量。当数据框非常大时,这很重要。