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つあります。ただの場合に役立ちます。
返信いただきありがとうございます!結合オプションについて知っていますが、問題はさらに結果を分析する必要があるため、すべてのベクトルを単一のオブジェクトとして必要とすることです。すべてのベクトルを1つの大きなベクトルに貼り付けると、リストに格納されているかのようにそれらを取り出すことはできません。 – snoops
@snoopsデフォルトの動作は、すべてのベクトルを1つのベクトルに貼り付ける*ではない*です。デフォルトでは、各結果がリストの要素として返されます。 '.combine =" c "'を指定した場合にのみ結果を連結します。 –
私は、デフォルト設定では関数の出力をリストに格納するので、 '.combine =" list ""と入力しても何の違いもないと思っていました。どうやら私は間違っていた:)再び私を助けてくれてありがとう! – snoops