2015-02-24 30 views
5

Próbuję uruchomić predict() równolegle na moim komputerze z systemem Windows. Działa to na mniejszym zbiorze danych, ale nie skaluje się dobrze, ponieważ dla każdego procesu tworzona jest nowa kopia ramki danych. Czy istnieje sposób równoległego uruchamiania bez tworzenia tymczasowych kopii?Równoległe przewidywanie

mojego kodu (tylko nieliczne modyfikacje this oryginalnego kodu):

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) 

Używam prostego replikacji danych, aby go przetestować. Z scale 10 lub 1000 działa, ale chciałbym, aby działał z scale <- 1000000 - ramka danych z 16 milionów wierszy (ramka danych 1,86 GB, jak wskazano przez object_size() z pryr. Zauważ, że w razie potrzeby mogę również użyć maszyny Linux, jeśli to jest jedyną opcją

Odpowiedz

6

można użyć funkcji isplitRows z pakietu itertools wysłać tylko część longley2, co jest potrzebne do tego zadania.

library(itertools) 

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

zapobiega całą ramkę longley2 dane przed automatycznie eksportowane do każdego z pracowników i upraszcza trochę kodu.