1

我是 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 的最佳方法是将迭代分块到集群中。在这个方向上的任何帮助都会非常有帮助。提前致谢。

4

1 回答 1

1

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

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

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

请注意,它用于c将返回的列表组合lapply成一个列表。

于 2016-07-31T12:54:32.753 回答