R中的并行化“查找”循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R中的并行化“查找”循环相关的知识,希望对你有一定的参考价值。

R中有几个软件包可以简化并行运行代码,如foreachfuture。其中大多数都有像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中的并行化“查找”循环的主要内容,如果未能解决你的问题,请参考以下文章

为啥以下简单的并行化代码比 Python 中的简单循环慢得多?

如何在 python 中并行化以下代码片段?

OpenMP 无法使用映射迭代器并行化 for 循环

R中的并行计算,用于通过循环保存数据

R中的并行化:如何在每个节点上“源”?

非for循环的OpenMP并行化