在R中并行循环

时间:2017-03-30 14:43:08

标签: r while-loop parallel-processing

我想知道是否/如何在R中并行化while循环。

如果不可能或合理地认为难以完成,我会非常感谢另一种选择,可能使用并行for循环。

1 个答案:

答案 0 :(得分:9)

您可以将期货用于包含for()while()循环的任何循环R构造。期货在future包中实现(我是作者)。

您不希望将什么条件用于while循环。这将有助于提供更准确的答案。下面是一个示例,其中while条件 not 取决于计算的任何结果:

library("listenv")
library("future")
plan(multiprocess, workers = 2L)

res <- listenv()

ii <- 1L
while (ii <= 5) {
  ## This is evaluated in parallel and will only block
  ## if all workers are busy.
  res[[ii]] %<-% {
    list(iteration = ii, pid = Sys.getpid())
  }
  ii <- ii + 1L
}

## Resolve all futures (blocks if not already finished)
res <- as.list(res)

str(res)
List of 5
 $ :List of 2
  ..$ iteration: int 1
  ..$ pid      : int 15606
 $ :List of 2
  ..$ iteration: int 2
  ..$ pid      : int 15608
 $ :List of 2
  ..$ iteration: int 3
  ..$ pid      : int 15609
 $ :List of 2
  ..$ iteration: int 4
  ..$ pid      : int 15610
 $ :List of 2
  ..$ iteration: int 5
  ..$ pid      : int 15611

如果你希望你的while条件依赖于一个或多个并行结果的结果(在res[[ii]]中)那么事情会变得复杂得多,因为那时你需要弄清楚如果将来会发生什么(=并行任务)仍未解决;你应该检查一下,比如说,之后再进行5次迭代,或者你应该等一下。这是并行算法的设计问题,而不是如何实现。一切皆有可能。

PS。我不明白这个问题得到的支持。这可能是因为你的问题措辞不清楚/不太清楚 - 记得尽可能地尝试帮助你帮助你。尽可能精确。如果downvotes是因为while循环,我(显然)请求不同意。