25

いくつかのコアでコードを実行しようとしています(snowparallelパッケージの両方を試しました)。私は持っています

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

最後の行はエラーを返します:

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

明らかに、地球環境でparSapplyは見つかりません。yこれを回避する方法はありますか?ありがとう。

4

2 に答える 2

24

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)
于 2012-04-10T20:39:10.240 に答える
7

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)

これは、他の関数で作成された関数は、それらが作成されたローカル環境と一緒にシリアル化されますが、グローバル環境から作成された関数は、グローバル環境と一緒にシリアル化されないためです。これは便利な場合もありますが、問題に気付いていない場合は、さまざまな問題が発生する可能性もあります。

于 2013-04-02T03:16:40.270 に答える