2012-04-10 12 views
22

Sto cercando di eseguire codice su più core (ho provato entrambi i pacchetti snow e parallel). HoparSapply non trovando oggetti nel contesto globale

cl <- makeCluster(2) 
y <- 1:10 
sapply(1:5, function(x) x + y) # Works 
parSapply(cl, 1:5, function(x) x + y) 

L'ultima riga restituisce l'errore:

Error in checkForRemoteErrors(val) : 
    2 nodes produced errors; first error: object 'y' not found 

Chiaramente parSapply non è trovare y nel contesto globale. Qualche modo per aggirare questo? Grazie.

risposta

20

I nodi non conoscono il y nel contesto globale sul master. Devi dirlo in qualche modo.

library(parallel) 
cl <- makeCluster(2) 
y <- 1:10 
# add y to function definition and parSapply call 
parSapply(cl, 1:5, function(x,y) x + y, y) 
# export y to the global environment of each node 
# then call your original code 
clusterExport(cl, "y") 
parSapply(cl, 1:5, function(x) x + y) 
5

Vale la pena ricordare che il vostro esempio funziona se parSapply viene chiamato all'interno di una funzione, anche se il vero problema è dove si crea la funzione function(x) x + y. Ad esempio, il seguente codice funziona correttamente:

library(parallel) 
fun <- function(cl, y) { 
    parSapply(cl, 1:5, function(x) x + y) 
} 
cl <- makeCluster(2) 
fun(cl, 1:10) 
stopCluster(cl) 

Questo perché le funzioni che vengono creati in altre funzioni vengono serializzati insieme con l'ambiente locale in cui sono stati creati, mentre le funzioni create dall'ambiente globale non vengono serializzati insieme con l'ambiente globale. Questo può essere utile a volte, ma può anche portare a una varietà di problemi se non si è a conoscenza del problema.

Problemi correlati