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

标签 r foreach parallel-processing random-forest na

这是我尝试使用 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/

相关文章:

r - 在 ggplot2 中自定义图例大小符号项

Jquery循环遍历运行时创建的元素

c++ - C++中foreach循环的使用

python - cython错误无法分配给外部并行 block 的私有(private)

c# 线程和 Thread.Join

r - 矩阵用一填充零行

r - 如果索引列名是连接列名的前缀,Data.table join with index 会产生意外的结果

r - 如何用列名替换某些值

c# - 如何使用键和值循环所有类变量

java - 当 ForkJoinPool 结束时