2012-04-10 3 views
22

여러 코어에서 코드를 실행하려고합니다 (snowparallel 패키지를 모두 시도했습니다).parSapply 글로벌 환경에서 개체를 찾을 수 없습니다.

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

은 분명히 parSapply은 글로벌 환경에서 y을 찾는되지 않은 : 나는 마지막 줄은 오류를 반환

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

있습니다. 이 문제를 해결할 수있는 방법은 무엇입니까? 감사.

답변

20

노드는 마스터의 글로벌 환경에서 y에 대해 알지 못합니다. 어떻게 든 그들에게 말해야합니다.

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

그것은 parSapply가 함수 내에서 호출되는 경우 기능 function(x) x + y가 생성되는 경우 실제 문제가 있지만 귀하의 예제가 작동 할 것이라고 언급 할 가치가있다. 예를 들어, 다음 코드는 제대로 작동 : 다른 기능에서 생성 기능은 생성 된에 지역 환경과 함께 직렬화하기 때문에 지구 환경에서 생성 기능을 함께 직렬화되지 않습니다 동안

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

이있다 지구 환경과 이것은 때때로 유용 할 수 있지만 문제를 인식하지 못한다면 다양한 문제가 발생할 수도 있습니다.

관련 문제