我在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
所以正常循环运行得更快......这是正常的吗?
感谢您的帮助。
答案 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
一般情况下,如果您的任务需要很长时间才能运行,那么进行并行计算是值得的。