2016-07-05 5 views
0

foreachパッケージを使用してRで並列処理をしようとしていますが、動かしていません。私はベクトルを返す自分で作成した関数(Xenopus_Walk)を使用しています。ここでは、ベクトル(newly_populated_vec)に保存されているすべての数値に対してこの関数を実行して、リストの1つの要素として作成されたすべてのベクトルを格納するリストを取得します。私は現在使用しているコマンドは(私はそれがほとんど唯一のエクスポートされたパッケージだと、私の機能が依存するパラメータので、あなたはそれのほとんどを無視することができますね)以下の通りです:返されるリストの長さが、イテレータが取り出されたベクトルの長さと一致しません。

no_cores <- detectCores()-1 
cl <- makeCluster(no_cores) 
registerDoParallel(cl) 
Xenopus_Data <- foreach(b=1:length(newly_populated_vec),.combine=list,.multicombine=TRUE,.packages = c("raster", "gdistance", "rgdal","sp")) %dopar% { Xenopus_Walk(altdata=altdata,water=water,habitat_suitability=habitat_suitability,max_range_without_water=max_range_without_water,max_range=max_range,slope=slope,Start_Pt=newly_populated_vec[b]) } 

私が今持っている問題は、の長さでありますリスト(Xenopus_Dataが)私は(newly_populated_vec)からイテレータを取得するベクトルの長さが異なるSI返さ:

> length(Xenopus_Data) 
[1] 47 
> length(newly_populated_vec) 
[1] 2027 

間違っているかを把握しようとしていますが、私は1つが均等にワークロードを分割する必要があることを読みましたチャンクを作り、それぞれをコアに渡しますが、おそらくあなたはすべてのことを理解することができます彼はかなり低いです。私は自分の気持ちで合計32コアを持っています。 誰も私がこの問題を抱えている理由とそれを解決する方法を知っていますか?私は再現可能な例が望まれていることを知っていますが、私が使用する関数はかなり長く、誰もがそれを処理しようとしているのではないでしょうか。それでも、私が追加情報を提供して物事をより明確にすることができれば、私はそうすることがうれしいでしょう! どのような種類のヘルプも非常に高く評価されています。前もって感謝します!

EDIT:リストを見るとネストされているので、ベクトル内のすべての数値に対して1つの要素が得られるわけではありませんが、複数のサブ要素を持つ要素が1つあります。ただの場合に役立ちます。

答えて

0

オプションを使用してより大きな値を指定しない限り、100を超える結果があるとネストされたリストになるので、.combine=listを使用しないでください。私はそれ以前に使用されていることを見てきましたが、私はそれがいつも、.combineの機能の誤解のために行われていると確信しています。

デフォルトの動作では、すべての結果がリストに表示されるため、.combineおよび.multicombineオプションを削除するだけで問題を解決できます。

はここでこれを示し単純な例です:デフォルト.combine機能を使用して

> length(foreach(1:2027, .combine='c') %do% 1:10) 
[1] 20270 
> length(foreach(1:2027, .combine=list, .multicombine=TRUE) %do% 1:10) 
[1] 47 
> length(foreach(1:2027) %do% 1:10) 
[1] 2027 

、結果は常に、その長さに関係なく、結果のタイプの、指定されたタスクの数に等しいリストです。あなたが興味を持っている場合は


、ここに明示的に機能を兼ね備え単にデフォルトと同じように動作組み合わせる関数を定義して使用することができます方法は次のとおりですように、あなたが.init=list()を指定する必要があります

library(foreach) 
# This is defined the same as "foreach:::defcombine" 
listcomb <- function(a, ...) { 
    # concatenate new results with list of all previous results 
    c(a, list(...)) 
} 
r <- foreach(1:101, .combine='listcomb', .init=list(), 
    .multicombine=TRUE, .maxcombine=100) %do% { 
    list() 
} 

注意listcombの最初の引数は、listcombが初めて呼び出されたときに空のリストになります。これをしないと、リストの場合は最初の結果が破損します。

+0

返信いただきありがとうございます!結合オプションについて知っていますが、問題はさらに結果を分析する必要があるため、すべてのベクトルを単一のオブジェクトとして必要とすることです。すべてのベクトルを1つの大きなベクトルに貼り付けると、リストに格納されているかのようにそれらを取り出すことはできません。 – snoops

+0

@snoopsデフォルトの動作は、すべてのベクトルを1つのベクトルに貼り付ける*ではない*です。デフォルトでは、各結果がリストの要素として返されます。 '.combine =" c "'を指定した場合にのみ結果を連結します。 –

+0

私は、デフォルト設定では関数の出力をリストに格納するので、 '.combine =" list ""と入力しても何の違いもないと思っていました。どうやら私は間違っていた:)再び私を助けてくれてありがとう! – snoops

関連する問題