这是我尝试使用 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
最佳答案
在并行处理大型矩阵时,仅传递每个集群工作人员所需的数据可能非常重要。在 Linux 上直接或间接使用 mclapply
时,这不是问题。但在 Windows 上,输入数据是通过套接字连接发送到集群工作人员的,因此它可能非常重要。
对于这种情况,我使用 itertools
包中的 isplitCol
函数。它在矩阵的列 block 上创建一个迭代器。使用 chunks
参数,您可以拆分矩阵,以便每个集群工作人员获得一个子矩阵。
这是您的示例到 foreach
的翻译,它使用 isplitCol
将输入矩阵拆分为 7 个子矩阵,从而将发送给每个工作人员的数据减少了七倍与向每个 worker 自动导出 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)
关于r - 拆分数据集并将子集并行传递给函数,然后重新组合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17350867/