3

並列計算中に複数の印刷関数がある場合、最後のオンのみがコンソールに表示されることがわかりました。そのため、outfile オプションを設定し、すべての印刷結果を取得できることを願っています。Rコードは次のとおりです。

cl <- makeCluster(3, type = "SOCK",outfile="log.txt") 

abc <<- 123

clusterExport(cl,"abc")

clusterApplyLB(cl, 1:6,  
         function(y){
                     print(paste("before:",abc));
                     abc<<-y;
                     print(paste("after:",abc));
         }
)
stopCluster(cl)

しかし、次の 3 つのレコードしか取得できません。

starting worker for localhost:11888 
Type: EXEC 
Type: EXEC 
[1] "index: 3"
[1] "before: 123"
[1] "after: 2"
Type: EXEC 
[1] "index: 6"
[1] "before: 2"
[1] "after: 6"
Type: DONE 
4

1 に答える 1

4

log.txt で 1 つのワーカーからの出力しか取得していないようです。outfile="log.txt"を指定すると、各ワーカーは追加のために log.txt を開いてから を呼び出すため、私はよくそれが起こるのではないかと考えてきましたsinkoutfileが空の文字列でない場合にワーカー プロセスによって実行されるコードを次に示します。

## all the workers log to the same file.
outcon <- file(outfile, open = "a")
sink(outcon)
sink(outcon, type = "message")

すべてのワーカーが同時に追加するために同じファイルを開くとどうなるかわからないため、これは私を緊張させます。OS またはファイル システムに依存している可能性があり、1 つのワーカーからのみ出力を取得している理由を説明している可能性があります。

このため、私は を使用する傾向がありますoutfile=""。この場合、このコードは実行されず、関数でリダイレクトせずに出力操作を正常に実行できsinkます。ただし、Windows では、Rgui を使用している場合は出力が表示されないため、代わりに Rterm を使用してください。

タスクに複数の print ステートメントを使用しても問題はありませんが、 を設定していない場合はoutfile、すべての出力が /dev/null にリダイレクトされるため、何も出力されません。

于 2013-10-31T14:05:04.983 に答える