R中的并行化“查找”循环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R中的并行化“查找”循环相关的知识,希望对你有一定的参考价值。
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
答案
您可以使用共享内存,以便进程可以相互通信。为此,你可以使用package 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
,这是在所有进程之间共享的。
由于您的问题不可重复且我不了解您需要的所有内容,因此您可能需要稍微调整此解决方案。
以上是关于R中的并行化“查找”循环的主要内容,如果未能解决你的问题,请参考以下文章