2015-02-24 59 views
5

我试图在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()pryr指示。注意,如有必要,我也可以使用Linux机器,如果这是唯一的选择

回答

6

可以使用isplitRows功能从itertools包只发送所需要的任务的longley2部分:

library(itertools) 

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

,因此整个longley2数据帧被自动输出给每个工人并简化了代码一点。