R中的并行while循环

Posted

技术标签:

【中文标题】R中的并行while循环【英文标题】:Parallel while loop in R 【发布时间】:2017-08-24 13:41:04 【问题描述】:

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

如果不可能或被合理地认为太难完成,我将非常感谢替代方案,可能使用并行 for 循环。

【问题讨论】:

极不可能在 R 中使用 while 循环。 感谢您的回复。你介意详细说明为什么吗?从概念的角度来看,我似乎应该使用 while 循环。是什么让 while 循环成为 R 的糟糕选择(因为我认为它通常不是一个糟糕的选择)? 并行化一个通用的while 循环在概念上是不可能的 感谢您的回复,这是迄今为止唯一真正回答所提出问题的人。不可能是一个强有力的词,难怪您必须对声明进行限定才能使其有效。但它现在符合我的目的。 【参考方案1】:

您可以将期货与任何循环 R 构造一起使用,包括 for()while() 循环。 Futures 在future 包中实现(我是作者)。

尚不清楚您要为 while 循环使用什么条件。这将有助于给出更准确的答案。下面是一个例子,其中 while 条件 依赖于任何计算结果:

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。我不明白这个问题收到的反对票。可能是因为您的问题措辞不佳/不是很清楚 - 请记住尽可能准确地尝试“帮助助手帮助您”。如果反对票是因为 while 循环,我(显然)不同意。

【讨论】:

非常感谢亨利克!不幸的是,我的 while 循环的终止条件取决于计算结果,所以我担心并行化相当困难,但如果不能完成,也没什么大不了的。诚然,我的问题应该更清楚,例如通过说明所采用的终止条件的类型。提出这样一个模糊问题的原因是我不知道终止条件的类型会产生如此大的影响(我是并行化的新手,并且是自学的)。至于 while 循环,据我所知,它是 R 中完全有效的循环类型(可能是任何语言)。

以上是关于R中的并行while循环的主要内容,如果未能解决你的问题,请参考以下文章

R中的“for循环”中的“while循环”不起作用?

对于 R 中的大型必要循环,“while 循环”是不是应该优于“for 循环”?

R中的for循环与while循环

用两条语句并行化 while 循环(弗洛伊德循环检测算法)

R中的do-while循环

如何矢量化由 R 中的 while 循环创建的输出?