複数のスレッドがハードディスク上の異なるファイルにアクセスしようとすると、パフォーマンスが大幅に低下する可能性があります。
ただし、計算に十分な時間が費やされれば、負荷分散された並列化は改善につながる可能性があります。ノードは同期から外れるため、ハードディスク要求はすべて同時にではなく、次々に発生します。
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)

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)

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