2012-02-22 12 views
6

複数のコアでdoSNOWパッケージを使用してグローバル変数にアクセス/書き込みするときに問題はありますか?以下のプログラムでdoSNOWを使用してRで並列化を行う際にグローバル変数に書き込む?

、MyCalculationsの各(ii)は、マトリックスのII-番目の列「グローバル変数」に書き込み...

あなたは結果が正しいだろうと思いますか?隠れた漁場はありますか?

ありがとうございます!

p.s.これは単純な例なので、グローバル変数に書き出す必要があります。実際には、並列ループ内から多くの出力を転送する必要があります。したがって、おそらく唯一の方法はグローバル変数に書き出すことです。 ..

library(doSNOW) 
MaxSearchSpace=44*5 
globalVariable=matrix(0, 10000, MaxSearchSpace) 
cl<-makeCluster(7) 
registerDoSNOW(cl) 
foreach (ii = 2:nMaxSearchSpace, .combine=cbind, .verbose=F) %dopar% 
    { 
    MyCalculations(ii) 
    } 

stopCluster(cl) 

ps DoSnowフレームワーク内で、グローバル変数へのアクセスや書き込みの危険性はありませんか?質問

+1

[doRedis](https://github.com/bwlewis/doRedis)を使用すると、グローバル変数へのアクセスの必要性を処理することができます。 – daroczig

答えて

7

この質問は数ヶ月ですので、私はあなたが今答えを見つけたことを願っています。しかし、フィードバックに興味がある場合は、次の点を考慮する必要があります。

foreachとパラレルバックエンドを使用する場合、Rのグローバル環境内の変数に、試行中の方法で割り当てることはできません(あなたはおそらくこれに気づいた)。 連続したバックエンドを使用すると、割り当ては機能しますが、doSNOWのようにというパラレルを使用しません。

代わりに、各繰り返しの計算結果をすべてリストに保存し、オブジェクトに戻します。これにより、すべての計算が完了した後で適切な結果を抽出できます。私の提案は、あなたの例と同様に開始し

:すべての反復が完了した後

library(doSNOW) 
MaxSearchSpace <- 44*5 
cl <- makeCluster(parallel::detectCores()) 

# do not create the globalVariable object 

registerDoSNOW(cl) 

# Save the results of the `foreach` iterations as 
# lists of lists in an object (`theRes`) 

theRes <- foreach (ii = 2:MaxSearchSpace, .verbose=F) %dopar% 
    { 
# do some calculations 
    theNorms <- rnorm(10000) 
    thePois <- rpois(10000, 2) 
# store the results in a list 
    list(theNorms, thePois) 
    } 

は、theResから結果を抽出し、(例えば、globalVariableglobalVariable2、など)のオブジェクト

globalVariable1 <- do.call(cbind, lapply(theRes, "[[", 1)) 
globalVariable2 <- do.call(cbind, lapply(theRes, "[[", 2)) 
として保存します

これを念頭において、以前の反復の計算結果に依存する各反復で計算を実行する場合、このタイプの並列計算は適切ではありません取るach。

関連する問題