根据先前的结果并行化for循环

时间:2012-09-15 10:48:11

标签: r parallel-processing

我刚刚使用包parallelforeach()函数执行了我的第一步。因此这个问题会相当愚蠢。所以这是我想完成的任务:

  1. 将函数应用于对象t
  2. 在下一次迭代中使用结果
  3. 一个简单的例子是:

    newFunc<-function(){
        test[i+1] <<- sqrt(test[i])
    }
    
    test <- c(1,rep(NA, 10))
    
    foreach(i=1:11, .combine='rbind', .export='test')%do% newFunc()
    

    这也为我提供了一个矢量作为for-loop当然也是如此。但是,如果我尝试并行化,这会产生不同的结果:

    test <- c(1,rep(NA, 10))
    
    library(doParallel)
    library(foreach)
    cl <- makeCluster(4)
    registerDoParallel(cl)
    
    foreach(i=1:11, .combine='rbind', .export='test')%dopar% newFunc()
    
    stopCluster(cl)
    

    这给我留下了输出c(1, NA, NA, NA, NA, ..., NA)。我猜测这是因为奴隶不知道其他功能的结果?我希望我提供了必要的信息。我的实际功能当然更复杂,但这个例子似乎是最简单的方式来证明我的问题。

    编辑:我想第一个问题是:这样的问题可以并行化吗?

1 个答案:

答案 0 :(得分:2)

确实,所提出的迭代并不是并行运行,而是

test = numeric(11); test[] = 2
test^(1/2^(0:10))

是您感兴趣的解决方案。这很容易(虽然不必要,因为计算已经过矢量化)并行化

fun = function(i, test)
    test[i] ^ (1 / 2^(i - 1))
unlist(mclapply(seq_along(test), fun, test))

对于并行评估,fun不应更新非局部变量(与<<-一样)。也许您的真正问题可以通过允许并行评估的方式提出,即使原始公式似乎需要连续评估?