【问题标题】:doSNOW/foreach Performance IssuesdoSNOW/foreach 性能问题
【发布时间】:2012-07-20 04:19:36
【问题描述】:

我有一个循环,它正在加载大约 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. 是否有工作人员可以输出到屏幕,这样我至少可以了解我的工作进展如何。

提前谢谢你!

【问题讨论】:

  • 那篇博文的作者最后似乎解决了他的问题:这对你的情况没有帮助吗?
  • 我认为我的情况会很好,因为每个文件都需要几秒钟才能加载。事实并非如此。我目前正在尝试将 sfLapply 与降雪一起使用。但是稳定性很差。 R 一直在崩溃。
  • Parallel 尝试加载 不同的 文件可能会导致性能非常差。因此,如果文件的加载占用了相当多的总时间,那么顺序读取它们可能会好得多。如果没有,使用负载平衡并行化可能会有所帮助(例如parallel::clusterApplyLB 或其降雪类似物)。如果并行化没有负载平衡,您将处于所有线程同时从 HDD 请求不同文件的情况。
  • 有什么特别的原因让你更喜欢 doXXX 而不是例如parallel::clusterApply?
  • 感谢 cmets @cbeleites 能否详细说明我为什么需要使用负载均衡?

标签: performance r parallel-processing


【解决方案1】:

多个线程尝试访问硬盘上的不同文件可能会导致性能非常差。

但是,如果有足够的时间进行计算,负载平衡并行化仍可能带来改进:节点将失去同步,因此硬盘请求将一个接一个地出现,而不是同时出现。

这是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,下一个任务会在节点返回结果后立即分发。即使任务花费基本相同的时间,它们也会很快失去同步,并且文件加载不会完全同时。

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

【讨论】:

  • snowfall 和 doSnow 有什么区别?
  • @skan: snowfall 是雪上的附加层。它允许编写例如可以使用集群的程序(如果可用),但如果没有,它们将按顺序工作。请参阅cran.r-project.org/web/packages/snowfall/index.html 提供的包说明和插图。这是相当古老的东西,现在平行的 package 已经出现,它是基础 R。所以在实践中,我现在会尝试使用 parallel,除非有非常具体的额外需求。
  • 好的,谢谢。那么我也应该学习并行而不是 doSnow 吗?无论如何,如果我不仅想在同一台计算机的处理器之间分配计算,而且还想在集群中的不同计算机之间分配计算呢?
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多