で奇妙な問題に遭遇しましたclusterApply
。これは、次のようにできる限り分離することができました。まず、グローバル環境から次のコードを実行します。
require(parallel)
cl<-makeCluster(rep("localhost",20),"SOCK")
xl<-list()
for(i in 1:20)
xl[[i]]<-crossprod(matrix(rnorm(1e6),1000,1000))
x<-xl
clusterExport(cl,"x",environment())
f0<-function(z) eigen(x[[z]])
system.time(clusterApply(cl,1:20,f0))
## user system elapsed
## 0.332 0.264 3.334
clusterApply
ここで、おかしなことが起こっていないことを確認するために、R を再起動し、関数内から呼び出す次の同様のコードを実行します。
require(parallel)
cl<-makeCluster(rep("localhost",20),"SOCK")
xl<-list()
for(i in 1:20)
xl[[i]]<-crossprod(matrix(rnorm(1e6),1000,1000))
f<-function(clust,x){
force(x)
clusterExport(clust,"x",environment())
f0<-function(z) eigen(x[[z]])
print(system.time(clusterApply(clust,1:20,f0)))
}
f(cl,xl)
## user system elapsed
## 5.212 1.888 13.627
検索を行ったところ、グローバル環境で定義されていない関数で使用されるローカル変数がクラスターにエクスポートされることを指摘する、関連する質問に対するこの回答が見つかりました。だから私は、おそらく問題はx
2回エクスポートされていることであり、それが実際の関数呼び出しではなく、長い時間がかかっていることだと思いました。これをテストするために、関数定義を次のように変更しました。
f0<-function(z) eigen(get("x")[[z]])
そして、私はまだ遅いパフォーマンスを得ました。ここで何が起こっているのか知っている人はいますか?
ちなみに電話したら
clusterApply(clust,x,eigen)
関数内では、グローバル環境にあるかのように高速に動作します。もちろん、これが私が解決しようとしている問題である場合は、単純にそうしますが、そうではありません。これは、他のより複雑なコードで発生している問題を切り分けるための単なるおもちゃの問題です。