拆分数据集并将子集并行传递给函数,然后重新组合结果

hem*_*ema 3 parallel-processing foreach r na random-forest

以下是我使用foreach包尝试做的事情.我有600行和58000列的数据集,有很多缺失值.

我们需要使用名为"missForest"的包来计算缺失值,其中它不是并行的,需要花费很多时间来立即运行这些数据.所以,我想把数据分成7个数据集(我有7个核心),行数(行数)和col(标记)数不同.然后使用%dopar%将数据集并行传递给missForest?

我不知道如何将数据划分为更小的数据集,并将这些数据集传递给missForest,然后重新组合输出!

如果你能告诉我怎么样,我会非常感激吗?

这是一个小例子,形式BLR包,演示了我的问题:

library(BLR)
library(missForest)
data(wheat)
X2<- prodNA(X, 0.1)
dim(X2)                 ## i need to divide X2 to several 7 data frames (ii)

X3<- missForest(X2)

X3$Ximp  ## combine ii data frames
Run Code Online (Sandbox Code Playgroud)

Ste*_*ton 7

在并行处理大型矩阵时,只传递每个集群工作人员所需的数据非常重要.在Linux上使用时mclapply,直接或间接使用时不会出现问题doParallel.但是在Windows上,输入数据通过套接字连接发送给集群工作者,因此它非常重要.

对于这样的情况,我使用包中的isplitCol函数itertools.它在矩阵的列块上创建迭代器.使用该chunks参数,您可以拆分矩阵,以便每个集群工作者只获得一个子矩阵.

下面是您的示例的转换foreach,用于isplitCol将输入矩阵拆分为7个子矩阵,从而将发送给每个工作者的数据减少7倍,与自动导出X2到每个工作者相比:

library(doParallel)
library(itertools)
library(BLR)
library(missForest)
ncores <- 7
cl <- makePSOCKcluster(ncores)
registerDoParallel(cl)
data(wheat)
X2 <- prodNA(X, 0.1)
X3 <- foreach(m=isplitCols(X2, chunks=ncores), .combine='cbind',
              .packages='missForest') %dopar% {
  missForest(m)$ximp
}
print(X3)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)