我编写了一个在没有并行化的情况下花费大量时间的例程。
问题在于我不确定要迭代什么,因为我有一个带有中断的重复循环。
循环包含以下代码片段(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
}
因为,我不知道重复循环会停止的时间。
答案 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