doSNOW / foreach性能问题

时间:2012-07-20 04:19:36

标签: performance r parallel-processing

我有一个循环,它正在加载大约每个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 个答案:

答案 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)

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,一旦节点返回结果,就会分发下一个任务。即使任务基本上同时进行,它们也会很快失去同步,文件加载也不会完全同时进行。

(我不知道这是否是实际问题)