2012-04-10 3 views
22

Ich versuche, Code auf mehreren Kernen auszuführen (Ich habe versucht, die snow und parallel Pakete). Ich habeparSapply nicht Objekte in der globalen Umgebung zu finden

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

Die letzte Zeile gibt den Fehler:

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

Klar parSapply nicht y im globalen Umfeld zu finden. Irgendwelche Möglichkeiten, um dies zu umgehen? Vielen Dank.

Antwort

20

Die Knoten wissen nicht über die y in der globalen Umgebung auf dem Master. Du musst es ihnen irgendwie sagen.

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

Es ist erwähnenswert, dass Ihr Beispiel wird funktionieren, wenn parSapply innerhalb einer Funktion aufgerufen wird, obwohl die eigentliche Frage ist, wo die Funktion function(x) x + y erstellt wird. richtig Zum Beispiel arbeitet der folgende Code:

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

Dies liegt daran, Funktionen, die in anderen Funktionen erstellt werden, zusammen mit der lokalen Umgebung serialisiert werden, in der sie erstellt wurden, während Funktionen aus dem globalen Umfeld geschaffen werden nicht entlang serialisiert mit der globalen Umwelt. Dies kann manchmal nützlich sein, aber es kann auch zu einer Vielzahl von Problemen führen, wenn Sie das Problem nicht kennen.

Verwandte Themen