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::clusterApplyvs 负载平衡的例子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)

clusterApplyLB

黑点标志着新函数调用的开始。如果函数从加载文件开始,所有节点总是会尝试同时访问硬盘,clusterApply因为集群在处理新一轮任务之前会等待所有节点返回结果。使用clusterApplyLB,下一个任务在节点返回结果后立即分发。即使任务花费基本相同的时间,它们也会很快失去同步,并且文件加载不会完全在同一时间。

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

于 2012-07-21T20:39:21.590 回答