运行时间foreach包

时间:2015-06-09 16:32:41

标签: r parallel-processing

我在R中使用foreach包有问题。实际上,当我编译这段代码时:

tmp=proc.time()
x<-for(i in 1:1000){sqrt(i)} 
x
proc.time()-tmp

和这段代码:

tmp=proc.time()
x<- foreach(i=1:1000) %dopar% sqrt(i)
x
proc.time()-tmp

并行计算的R控制台帖子:

utilisateur     système      écoulé 
      0.464       0.776       0.705  

和正常循环:

utilisateur     système      écoulé 
      0.001       0.000       0.001 

所以正常循环运行得更快......这是正常的吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

并行处理不会加快像sqrt(x)这样的简单操作。理想情况下,您可以将它用于更复杂的操作,或者执行类似的操作,

x<- foreach(i=0:9,combine = 'c') %dopar% sqrt(seq(i*10000000,(i+1)*10000000-1))
x

切换进程所需的时间比对这些任务要多。如果查看系统监视器/任务管理器中使用的处理器,您将看到只使用一个处理器,而不管您设置的后端。

编辑:似乎您没有为foreach循环设置并行后端,因此无论如何它都将默认为顺序模式。设置并行后端的简便方法是

library(doParallel)
ncores = detectCores()
clust = makeCluster(ncores - 2)
registerDoParallel(clust)
#do stuff here
#...
stopCluster(clust)

根据您的系统,您可能需要在R之外执行更多操作才能设置后端。

答案 1 :(得分:1)

以下是一些可用于在Windows上设置并行实验的测试代码:

library(foreach)
library(doParallel)

cl <- makePSOCKcluster(2)
registerDoParallel(cl)

system.time({
  x <- foreach(i=1:1000) %do% Sys.sleep(0.001)
})

system.time({
  x <- foreach(i=1:1000) %dopar% Sys.sleep(0.001)
})

stopCluster(cl)

您应该会发现并行实现的运行时间大约是串行实现的一半:

> system.time({
+   x <- foreach(i=1:1000) %do% Sys.sleep(0.001)
+ })
   user  system elapsed 
   0.08    0.00   12.55 
> 
> system.time({
+   x <- foreach(i=1:1000) %dopar% Sys.sleep(0.001)
+ })
   user  system elapsed 
   0.23    0.00    6.09 

请注意,并行计算不是灵丹妙药。固定的启动成本以及通信成本。见Amdahl's law

一般情况下,如果您的任务需要很长时间才能运行,那么进行并行计算是值得的。