【问题标题】:Parallel computing with recursive function具有递归函数的并行计算
【发布时间】:2013-12-26 08:41:56
【问题描述】:

我的挑战是并行计算递归函数。然而,递归相当深,因此(用我自己的新手的话来说)在所有工人都忙的时候分配一个工人是个问题。简而言之,它会粉碎。

这是一些可重现的代码。代码非常愚蠢,但结构才是最重要的。这是正在发生的事情的简化版本。

我在windows机器上工作,如果解决方案是去linux,直接说。因为真正的功能可能很深,管理上层调用的工人数量并不能解决问题。有没有办法知道递归在什么级别?

  FUN <- function(optimizer,neighbors,considered,x){
    considered <- c(considered,optimizer)
    neighbors <- setdiff(x=neighbors,y=considered)

    if (length(neighbors)==0) {
      # this loop is STUPID, but it is just an example.
      z <- numeric(10)
      for (i in 1:100)
      {
        z[i] <- sample(x,1)
      } 
      return(max(z)) 
    } else {
      # Something embarrassingly parallel, 
      # but cannot be vectorized.
      z <- numeric(10)
      z <- foreach(i=1:10, .combine='c') %dopar%{
        FUN(optimizer=neighbors[1],neighbors=neighbors,
                  considered=considered,x=x)}
    return(max(z))
    }
}

require(doParallel,quietly=T)
cl <- makeCluster(3)
clusterExport(cl, c("FUN"))
registerDoParallel(cl)
getDoParWorkers()



>FUN(optimizer=1,neighbors=c(2),considered=c(),x=1:500)
[1] 500
>FUN(optimizer=1,neighbors=c(2,3),considered=c(),x=1:500)
Error in { : task 1 failed - "could not find function "%dopar%""

【问题讨论】:

    标签: r recursion parallel-processing


    【解决方案1】:
    >FUN(optimizer=1,neighbors=c(2,3),considered=c(),x=1:500)
    Error in { : task 1 failed - "could not find function "%dopar%""
    

    这个错误真的是因为递归太深还是仅仅因为你的FUN 函数中没有require(doParallel)?因此,当在 worker 上调用 FUN 时,该 R 实例的列表中没有该包。

    您的第一个示例没有这样做,因为它足够简单,无法进入内部 %dopar% 循环。

    【讨论】:

    • 谢谢,我不知道我需要再次提供包裹。现在问题变成了资源的管理。您是否知道有关以递归并行方式管理资源的好资源?再次感谢。
    猜你喜欢
    • 2015-07-28
    • 2022-11-25
    • 2013-11-26
    • 2021-05-03
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多