并行预测

时间:2015-02-24 11:51:08

标签: r parallel-processing predict

我正在尝试在我的Windows计算机上并行运行predict()。这适用于较小的数据集,但不能很好地扩展,因为每个进程都会创建新的数据框副本。有没有办法在不制作临时副本的情况下并行运行?

我的代码(仅对this原始代码进行了少量修改):

library(foreach)
library(doSNOW)

fit <- lm(Employed ~ ., data = longley)
scale <- 100
longley2 <- (longley[rep(seq(nrow(longley)), scale), ])

num_splits <-4
cl <- makeCluster(num_splits)
registerDoSNOW(cl)  

split_testing<-sort(rank(1:nrow(longley))%%num_splits)

predictions<-foreach(i= unique(split_testing),
                     .combine = c, .packages=c("stats")) %dopar% {
                       predict(fit, newdata=longley2[split_testing == i, ])
                     }
stopCluster(cl)

我正在使用简单的数据复制来测试它。使用scale 10或1000它正在运行,但我想让它与scale <- 1000000一起运行 - 具有16M行的数据帧(1.86GB数据帧,由object_size()表示来自{{1}请注意,如果需要,我也可以使用Linux机器,如果这是唯一的选择。

1 个答案:

答案 0 :(得分:7)

您可以使用isplitRows包中的itertools函数仅发送任务所需的longley2分数:

library(itertools)

predictions <-
  foreach(d=isplitRows(longley2, chunks=num_splits),
          .combine=c, .packages=c("stats")) %dopar% {
    predict(fit, newdata=d)
  }

这可以防止整个longley2数据框自动导出到每个工作人员并简化代码。