0

私はネストされた*applyコールを持っており、それらを並列化したいと思います。トップ・コールまたはネストされた内部コールのいずれかで並列化するオプションがあります。理論的には、最初の方が良いと思われますが、私の問題は4つのコアがありますが、最も外側のオブジェクトは5つの部分があり、それぞれのサイズがさまざまです。最初の例を実行したとき、4つのコアすべてが約10分間実行されてから、2つのコアが終了しました。 1時間後に3番目のものが終了し、4番目のものが2つの最大のプロセスを得て1時45分に終了する最後のものでした。R:並列呼び出しが何であるべきか

それぞれのプロと詐欺は何ですか?

parLapply(cl, object, function(obj) lapply(obj, funct)) 

-- OR -- 

lapply(object, function(obj) parLapply(cl, obj, funct)) 

また、手動で負荷を分散する方法はありますか?そうすれば、私は2つの大きなオブジェクトを分離し、2つの小さなオブジェクトを一緒にすることができます。

編集:一般的に、CSの理論はこの状況について何を述べていますか?これは一般的に並列コールのための最良の場所です(このような特殊な状況を除く)

答えて

0

parLapplyクラスタタスクごとに1つのタスクグループが存在するようにタスクをグループ化します。あなたは、負荷分散が必要な場合は、それはうまく動作しませんので、私はあなたの代わりにclusterApplyLBを試すことを示唆している:

clusterApplyLB(cl, object, function(obj) lapply(obj, funct)) 

あなたは5個のタスクと4人の労働者を持っている場合、これは、労働者1-4のタスク1-4のスケジュールを設定しますその後、それは作業を最初に終える作業者にタスク5をスケジュールする。それは合理的にうまくいくかもしれませんが、最後のタスクが最短であればよりうまくいくでしょう。

代わり場合は、使用します。

lapply(object, function(obj) clusterApplyLB(cl, obj, funct)) 

それは5つの別々の並列ジョブを実行します。これらの並列ジョブ内のタスクが小さい場合、負荷分散の問題がある5つのジョブごとにリソースを無駄にすると、非常に非効率的になります。したがって、このアプローチは通常うまく機能しません。

通常、最初のケースを使用しますが、作業の数が作業者の数よりはるかに多くない場合、負荷分散は深刻な問題になることがよくあります。これは、すべてのターン

r <- 
    foreach(obj=object) %:% 
    foreach(o=obj) %dopar% { 
     funct(o) 
    } 

functへの各呼び出しは、妥当な時間(例えば秒の少なくともいくつかを、)取る場合、あなたはforeachのパッケージからのネスト演算子を使用してループをアンロール試みることができます単一のタスクストリームにfunctを呼び出しますが、依然として結果をリストのリストに返します。

私が書いたビネットでforeachネスト演算子を使用する方法について詳しくは、Nesting Foreach Loopsを参照してください。

+0

'clusterApplyNB'の問題は、私のリストにディメンションがないため、余白の値を入れることができないということです。 – Adam

+0

@Adam 'clusterApplyLB'は' parLapply'とまったく同じ引数をとり、機能的に同等です。どちらも基本的に 'lapply'の並列版です。それらの主な違いは、 'parLapply'は' mclapply'と同じようにタスクをグループ化し、 'clusterApplyLB'はロードバランシングを実行することです。 'clusterApplyLB'も' parLapply'も行列や配列で動作しません。 –

関連する問題