2015-02-24 53 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數據幀被自動輸出給每個工人並簡化了代碼一點。