并行R包中的foreach()如何处理带有中断的重复循环?

时间:2017-10-30 15:38:20

标签: r foreach parallel-processing

我编写了一个在没有并行化的情况下花费大量时间的例程。

问题在于我不确定要迭代什么,因为我有一个带有中断的重复循环。

循环包含以下代码片段(for循环未显示):

repeat{
    if(R < p){
        HAC.sim(K = K, N = ceiling(Nstar), Hstar = Hstar, probs = probs, perms = perms, equal.freq = FALSE, subset.haps = NULL)
} else{
    break
  }
}

我想将foreach()与并行后端一起使用;但是我不确定

需要什么
foreach(i = 1:???){
    some code
}

因为,我不知道重复循环会停止的时间。

1 个答案:

答案 0 :(得分:1)

您只能迭代您拥有的核心数。 然后,当一个核心找到解决方案然后停止其他核心时,您可以使用内存映射进行检测。

library(bigstatsr)
library(foreach)

ncores <- nb_cores()  # or parallel::detectCores() - 1
fbm <- FBM(1, 1, init = 0)   # shared memory
p <- 0.9999
HAC.sim <- function() runif(1)

cl <- parallel::makeCluster(ncores)
doParallel::registerDoParallel(cl)

res <- foreach(i = 1:ncores, .combine = 'c') %dopar% {
  repeat {
    if (fbm[1] != 0) return(NULL)
    R <- HAC.sim()
    if (R >= p) {
      fbm[1] <- 1   # tell the others to stop
      return(R)
    } 
  }
}

parallel::stopCluster(cl)

res