2016-07-28 71 views
1

我是一个用R并行计算的初学者。我最近开始使用使用doParallel包的foreach和并行计算。当我试图在将迭代器拆分为块时将列表编入索引时,我遇到了一个问题。isplitVector和foreach索引问题

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是块迭代到集群的最佳途径。在这方面的任何帮助将是非常有帮助的。提前致谢。

+0

谢谢伊莫,我已经添加了我使用过的包和我导出的变量。 –

回答

0

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

这里有一种方法,以你的例子分解成cores任务,工程即使mod_function不接受列表参数:

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

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