R的并行Foreach以高迭代器值开始缓慢。可以做些什么?

时间:2014-12-24 22:54:44

标签: r parallel-processing

在Windows平台上,似乎高迭代器值将在其轨道中停止前进。例如

library(doParallel)
library(foreach)
cl<-makeCluster(7) 
registerDoParallel(cl)
bayes_results<-foreach (n=1:100) %dopar% {n}

这可以在几秒钟内正常工作。

然而,即使经过几个小时的等待,也可以将价值增加到几百万次。

bayes_results<-foreach (n=1:5000000) %dopar% {n}

有什么问题?怎么可以解决?

谢谢。

1 个答案:

答案 0 :(得分:2)

除非个别任务可能需要数小时才能运行,否则您通常不希望任务数量大于工作人员数量级。 itertools包具有可以帮助控制任务数量的功能。例如,您可以使用isplitVector函数来分割输入向量,这样每个工作者只有一个任务:

library(itertools)
r <- foreach(nv=isplitVector(1:5000000, chunks=cores)) %dopar% { nv }

当然,您通常必须修改循环体,但现在循环在我的机器上运行不到一秒,正如您所期望的那样。

如果任务执行的时间长度不同,则可以通过将问题分成更多块来实现更好的负载平衡:

r <- foreach(nv=isplitVector(1:5000000, chunks=10*cores)) %dopar% { nv }

像这样拆分工作也可以让你并行化结果的组合,这也可以提高性能。