多个线程试图访问硬盘上的不同文件会导致性能非常差。
但是,如果有足够的时间进行计算,负载平衡并行化仍可能带来改进:节点将不同步,因此硬盘请求将一个接一个地出现,而不是同时出现。
这是一个简单的snow::clusterApply
vs 负载平衡的例子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
,下一个任务在节点返回结果后立即分发。即使任务花费基本相同的时间,它们也会很快失去同步,并且文件加载不会完全在同一时间。
(不过,我不知道这是否是实际问题)