2016-07-28 96 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返回的名單組合成一個單獨的列表。