2012-05-21 9 views
6

Jestem nowy w korzystaniu z równoległych pakietów i zaczęłam je badać, aby przyspieszyć część mojej pracy. Często spotykam się z irytacją, że polecenie foreach wywoła problemy, gdy nie mam odpowiednich funkcji/zmiennych.Wiedzieć, jakie obiekty klastraExport wcześniej

Przykład

Wiem, że przykład poniżej niekoniecznie musi foreach zrobić to szybko, ale ze względu na ilustracji, będę go używać.

library(doParallel) 
library(parallel) 
library(lubridate) 
library(foreach) 

cl <- makeCluster(c("localhost", "localhost", "localhost","localhost"), type = "SOCK") 
registerDoParallel(cl, cores = 4) 

Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 500, replace = TRUE) 

foreach(i = seq_along(Dates), .combine = rbind) %dopar% dmy(Dates[i]) 

Error in dmy(Dates[i]) : task 1 failed - "could not find function "dmy"" 

Jak widać, nie jest to błąd, który mówi, że funkcja dmy nie znaleziono. Potem trzeba iść dalej i dodać następujące:

clusterExport(cl, c("dmy")) 

Więc moje pytanie jest, oprócz patrząc na błąd wskazówek dotyczących tego, co na eksport, to jest bardziej eleganckim sposobem wiedząc wcześniej, co sprzeciwia się wyeksportować lub jest istnieje sposób na udostępnienie globalnego środowiska wszystkim niewolnikom przed uruchomieniem foreach?

+0

Istnieje argument ".packages" dla tego. –

+0

Czy mógłbyś opracować? Próbowałem (.packages()) i wymieniono załączone pakiety. Ale jak wyeksportować wszystkie obiekty paczki? Próbowałem clusterExport (cl, c ("library (lubridate)") i clusterExport (cl, c ("lubridate")) bezskutecznie. – JackeJR

+0

Przepraszam, miałem na myśli argument ".packages' do' foreach', a nie '. funkcja .packages'. –

Odpowiedz

2

Nie trzeba ręcznie eksportować poszczególnych funkcji pakietu. Możesz użyć argumentu .packages do funkcji foreach, aby załadować wymagane pakiety, więc wszystkie funkcje pakietu będą dostępne dla Twojego wyrażenia %dopar%.

+1

Czy to działa dla nowej biblioteki równoległej w wersji 2.14.0, np. parLapply? Mam podobny problem. –

+2

@ mindless.panda: Powinieneś być w stanie użyć 'clusterEvalQ (cl, library (packageName))', aby załadować pakiety na każdym węźle klastra. –

+0

Dzięki, po prostu umieściłem 'library (nazwa pakietu)' wewnątrz anonimowej funkcji w parLapply. –

Powiązane problemy