我有一个循环,它正在加载大约每个5MB的大小文件,而不是在它们上运行一些计算。我需要加载500-1000个。对于foreach来说,这似乎是一项轻松的工作。
我这样做但是doSNOW的表现似乎很可怕。
我发现了这篇帖子,这个家伙似乎也遇到了同样的问题:
http://statsadventure.blogspot.com/2012/06/performance-with-foreach-dosnow-and.html
所以有几个问题。
提前谢谢!
答案 0 :(得分:2)
尝试访问硬盘上不同文件的多个线程可能会导致性能非常差。
但是,如果有足够的时间进行计算,负载均衡的并行化仍然可以改善:节点将失去同步,因此硬盘请求将一个接一个地而不是同时进入。
以下是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
,一旦节点返回结果,就会分发下一个任务。即使任务基本上同时进行,它们也会很快失去同步,文件加载也不会完全同时进行。
(我不知道这是否是实际问题)