【问题标题】:isplitVector and foreach indexing issueisplitVector 和 foreach 索引问题
【发布时间】:2016-07-28 12:46:18
【问题描述】:

我是 R 并行计算的初学者。我最近开始使用 foreach 和使用 doParallel 包的并行计算。在将迭代器拆分为块后尝试索引列表时遇到问题。

library(itertools)
library(foreach)
library(doParallel)
    n=10000
    iter = 1:n
    cores = detectCores() -1
    c = makeCluster(cores)
    clusterExport(c,c("mod_function","test_list","cores")
    registerDoParallel(c)
    output <- foreach(i = isplitVector(iter,chunks = cores)) %dopar%
    {
    mod_function(test_list[[i]]
    }
    stopCluster(c)

我得到了错误

Error in { : task 1 failed - "recursive indexing failed at level 3

当我没有将迭代向量拆分为块时,我没有收到错误消息。我不确定 isplitVector 到底返回了什么以及如何索引列表。这对我有用

n=10000
iter = 1:n
cores = detectCores() -1
c = makeCluster(cores)
registerDoParallel(c)
output <- foreach(i = (1:n) %dopar%
    {
    mod_function(test_list[[i]]
    }
stopCluster(c)

由于我有很多迭代,我认为加快 foreach 的最佳方法是将迭代分块到集群中。在这个方向上的任何帮助都会非常有帮助。提前致谢。

【问题讨论】:

  • 谢谢 Imo,我已经添加了我使用的包和我导出的变量。

标签: r foreach itertools parallel-foreach


【解决方案1】:

isplitVector 函数返回一个迭代器,该迭代器返回其第一个参数的子向量(或子列表)。您收到错误是因为您使用 [[ 来索引带有向量的 test_list。您也许可以改用[,但如果mod_function 不接受列表参数,那将失败。

这是一种将您的示例分解为 cores 任务的方法,即使 mod_function 不接受列表参数也可以:

output <- 
  foreach(s=isplitVector(test_list, chunks=cores), .combine='c') %dopar% {
    lapply(s, mod_function)
  }

请注意,它使用clapply 返回的列表组合成一个列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多