我想知道是否/如何在R中并行化while循环。
如果不可能或合理地认为难以完成,我会非常感谢另一种选择,可能使用并行for循环。
答案 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循环,我(显然)请求不同意。