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 的数据量。当数据框非常大时,这很重要。
我想将一个大 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 的数据量。当数据框非常大时,这很重要。