1

私は R による並列計算の初心者です。最近、doParallel パッケージを使用して 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 を高速化する最善の方法は、繰り返しをクラスターにチャンクすることだと考えました。この方向の助けは非常に役に立ちます。前もって感謝します。

4

1 に答える 1

1

このisplitVector関数は、最初の引数のサブベクトル (またはサブリスト) を返す反復子を返します。ベクトルで[[インデックスを使用しているため、エラーが発生しています。代わりtest_listに使用できるかもしれませんが、リスト引数を受け入れない場合は失敗します。[mod_function

リスト引数を受け入れないcores場合でも機能するタスクに例を分割する 1 つの方法を次に示します。mod_function

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

cによって返されるリストを 1 つのリストに結合するために使用されることに注意してくださいlapply

于 2016-07-31T12:54:32.753 に答える