2015-02-24 24 views
5

Windows makinemde paralel olarak predict() çalıştırmaya çalışıyorum. Bu, daha küçük veri kümesi üzerinde çalışır, ancak her işlem için yeni bir veri çerçevesi kopyası oluşturulduğu kadar iyi ölçeklenmez. Geçici kopyalar yapmadan nasıl paralel koşulacak?Paralel tahmin

Kodum (this orijinal kod sadece birkaç modifikasyonlar): Ben bunu test etmek için basit veri çoğaltma kullanıyorum

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 veya 1000 ile çalışıyor, ancak scale <- 1000000 - 16M satırlı veri karesiyle çalışmak istiyorum (object_size()pryr'dan itibaren belirtildiği gibi.) Ayrıca gerektiğinde Linux makinesini de kullanabilirim. tek seçenektir

cevap

6

Sen görev için gerekli olan longley2 sadece kısmını göndermek için itertools paketinden isplitRows işlevini kullanabilirsiniz. Bu, otomatik olmaktan tamamını longley2 veri çerçevesini önler

library(itertools) 

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

işçilerin her birine ihraç ve basitleştirir biraz kod.