0

長さが異なるタスクを並列化するためにdoSNOW-パッケージを使用しています。1つのスレッドが終了したら、私は欲しいです

  • 次のスレッドに渡される古いスレッドによって生成されたいくつかの情報
  • すぐに次のスレッドを開始します (clusterApplyLB のような負荷分散)

シングルスレッドで動作します (makeClust( spec = 1 ) を参照) 。

#Register Snow and doSNOW
require(doSNOW)

#CHANGE spec to 4 or more, to see what my problem is
registerDoSNOW(cl <- makeCluster(spec=1,type="SOCK",outfile=""))

numbersProcessed <- c() # init processed vector
x <- foreach(i = 1:10,.export=numbersProcessed)  %dopar% {

    #Do working stuff
    cat(format(Sys.time(), "%X"),": ","Starting",i,"(Numbers processed so far:",numbersProcessed, ")\n")
    Sys.sleep(time=i)

    #Appends this number to general vector
    numbersProcessed <- append(numbersProcessed,i)

    cat(format(Sys.time(), "%X"),": ","Ending",i,"\n")
    cat("--------------------\n")
}

#End it all
stopCluster(cl)

ここで、「makeCluster」の仕様を 4 に変更します。出力は次のようになります。

[..]
Type: EXEC 
18:12:21 :  Starting 9 (Numbers processed so far: 1 5 )
18:12:23 :  Ending 6 
--------------------
Type: EXEC 
18:12:23 :  Starting 10 (Numbers processed so far: 2 6 )
18:12:25 :  Ending 7 

18:12:21 にスレッド 9 は、スレッド 1 と 5 が処理されたことを認識しました。2 秒後にスレッド 6 が終了します。次のスレッドは、少なくとも 1、5、および 6 について知っている必要がありますね。しかし、スレッド 10 は 6 と 2 しか知りません。

これはmakeClusterで指定されたコアで何かをしなければならないことに気づきました。9 は 1、5、9 (1 + 4 + 4) について知っており、10 は 2、6、10 (2 + 4 + 4) について知っています。

「処理された」ものをさらに世代のスレッドに渡すより良い方法はありますか?

ボーナスポイント: スノーパッケージからのこれらの「タイプ: EXEC」などのメッセージなしで、並列処理でマスターノードに「印刷」する方法はありますか? :)

ありがとう!マルク

4

1 に答える 1

1

私の悪い。くそ。

%dopar% を使用した foreachは負荷分散されていると思いました。これは事実ではなく、並列処理中にホスト側で何も実行できないため、私の質問は不要になります。これが、グローバル変数がクライアント側でのみ操作され、ホストに到達しない理由を説明しています。

于 2014-05-18T20:07:17.740 に答える