2015-02-24 20 views
5

Sto cercando di eseguire predict() in parallelo sul mio computer Windows. Funziona su un set di dati più piccolo, ma non si adatta bene, poiché per ogni processo viene creata una nuova copia del frame di dati. C'è un modo per correre in parallelo senza fare copie temporanee?Prevedi parallelo

il mio codice (solo poche modifiche di this codice originale):

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) 

sto usando semplice replica dei dati per testarlo. Con scale 10 oppure 1000 sta funzionando, ma desidero farlo funzionare con scale <- 1000000 -. Frame di dati con righe 16M (struttura dati 1.86GB come indicato dalla object_size() da pryr noti che quando necessario posso anche usare macchina Linux, se questo è l'unica opzione

risposta

6

è possibile utilizzare la funzione isplitRows dal pacchetto itertools di inviare solo la frazione di longley2 che è necessaria per l'attività:.

library(itertools) 

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

Ciò impedisce che l'intera struttura dati longley2 dall'essere automaticamente esportato a ciascuno dei lavoratori e semplifica il codice un po '.