R中有几个软件包可以简化并行运行代码,例如foreach
和future
。其中大多数都有类似lapply
或for循环的构造:它们一直持续到所有任务完成。
是否有Find
的简单并行版本?也就是说,我想并行运行几个任务。我不需要所有这些完成,我只需要完成第一个完成(可能有特定结果)。之后,其他任务可以被杀死,或者自己完成。
概念代码:
hunt_needle <- function (x, y) x %in% (y-1000):y
x <- sample.int(1000000, 1)
result <- parallel_find(seq(1000, 1000000, 1000), hunt_needle)
# should return the first value for which hunt_needle is true
答案 0 :(得分:2)
您可以使用共享内存,以便进程可以相互通信。 为此,您可以使用包 bigstatsr (免责声明:我是作者)。
选择一个块大小并执行:
# devtools::install_github("privefl/bigstatsr")
library(bigstatsr)
# Data example
cond <- logical(1e6)
cond[sample(length(cond), size = 1)] <- TRUE
ind.block <- bigstatsr:::CutBySize(length(cond), block.size = 1000)
cl <- parallel::makeCluster(nb_cores())
doParallel::registerDoParallel(cl)
# This value (in an on-disk matrix) is shared by processes
found_it <- FBM(1, 1, type = "integer", init = 0L)
library(foreach)
res <- foreach(ic = sample(rows_along(ind.block)), .combine = 'c') %dopar% {
if (found_it[1]) return(NULL)
ind <- bigstatsr:::seq2(ind.block[ic, ])
find <- which(cond[ind])
if (length(find)) {
found_it[1] <- 1L
return(ind[find[1]])
} else {
return(NULL)
}
}
parallel::stopCluster(cl)
# Verification
all.equal(res, which(cond))
基本上,当找到解决方案时,您不再需要进行某些计算,而其他人则知道这一点,因为您在1
中放置了found_it
,这是在所有进程之间共享的。
由于您的问题不可重复且我不了解您需要的所有内容,因此您可能需要稍微调整此解决方案。