1

それぞれ約 5MB のまともなサイズのファイルをロードし、それらに対していくつかの計算を実行するループがあります。500 ~ 1000 個をロードする必要があります。foreachにとっては簡単な仕事のようです。

私はこれをやっていますが、doSNOW のパフォーマンスは恐ろしいようです。

私はこの投稿を見つけましたが、この仲間は同じ問題を抱えているようです:

http://statsadventure.blogspot.com/2012/06/performance-with-foreach-dosnow-and.html

いくつか質問があります。

  1. doSnow に代わるものはありますか? doMC があることに気づきましたが、Windows を実行しています。
  2. Linux の doMC は doSNOW よりもはるかに高速ですか?
  3. ワーカーから画面に出力する方法はありますか?少なくとも、自分の仕事がどのように進行しているかをある程度把握することができます。

前もって感謝します!

4

1 に答える 1

3

複数のスレッドがハードディスク上の異なるファイルにアクセスしようとすると、パフォーマンスが大幅に低下する可能性があります。

ただし、計算に十分な時間が費やされれば、負荷分散された並列化は改善につながる可能性があります。ノードは同期から外れるため、ハードディスク要求はすべて同時にではなく、次々に発生します。

snow::clusterApply対負荷分散の簡単な例を次に示しますsnow::clusterApplyLB。タイミングとプロットを提供するため、並列の代わりに雪を使用します。

library (snow)
system(sprintf('taskset -p 0xffffffff %d', Sys.getpid()))
cl <- makeSOCKcluster (rep ("localhost", 2))

times <- sample (1:6) / 4
times
## [1] 1.50 0.25 0.75 1.00 0.50 1.25

t <- snow.time (l <- clusterApply (cl, times, function (x) Sys.sleep (x)))
plot (t, main = "\n\nclusterApply") 
for (i in 1 : 2)
  points (t$data[[i]][,"send_start"], rep (i, 3), pch = 20, cex = 2)

clusterApply

tlb <- snow.time (l <- clusterApplyLB (cl, times, function (x) Sys.sleep (x)))
plot (tlb, main = "\n\nclusterApplyLB")
for (i in 1 : 2)
  points (tlb$data[[i]][,"send_start"], rep (i, 3), pch = 20, cex = 2)

clusterApplyLB

黒い点は、新しい関数呼び出しの開始を示します。clusterApply関数がファイルのロードで開始する場合、クラスターはすべてのノードが結果を返すのを待ってから新しいラウンドのタスクを処理するため、すべてのノードが常に同時にハードディスクにアクセスしようとします。ではclusterApplyLB、ノードが結果を返すとすぐに次のタスクが渡されます。タスクに基本的に同じ時間がかかる場合でも、それらはかなり速く同期から外れ、ファイルのロードは正確に同時にはなりません。

(これが実際の問題かどうかはわかりませんが)

于 2012-07-21T20:39:21.590 に答える