在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}
有什么问题?怎么可以解决?
谢谢。
答案 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 }
像这样拆分工作也可以让你并行化结果的组合,这也可以提高性能。