2015-02-24 4 views
5

Я пытаюсь запустить predict() параллельно на моей машине с Windows. Это работает с меньшим набором данных, но не масштабируется так же, как для каждого процесса создается новая копия фрейма данных. Есть ли способ работать параллельно, не создавая временных копий?Параллельный прогноз

Моего код (только несколько модификаций 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 - кадром данных с 16-миллиметровыми строками (кадр данных 1,86 ГБ, как указано 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 данных от автоматического экспортируется каждому из рабочих и упрощает немного кода.

Смежные вопросы