8 コアのコンピューターで並列パッケージを使用して、Windows上の R で大量のデータを処理しようとしています。行ごとに処理する必要がある大きな data.frame があります。行ごとに、その行が処理されるのにかかる時間を見積もることができます。これは、行ごとに 10 秒から 4 時間まで大きく変動する可能性があります。
エラーが発生すると、結果セット全体が失われる可能性があるため、clusterApplyLB 関数の下でプログラム全体を一度に実行したくありません (これがおそらく最も最適な方法であることはわかっています)。プログラムを実行する最初の試みは、プログラムをブロックに分割し、各ブロックを個別に並行して実行し、その並行実行からの出力を保存してから、次のブロックに進むことでした。
問題は、7 倍の「リアルタイム」で実行するのではなく (8 コアを持っていますが、1 つのスペアを保持したかった)、行を実行すると、約 2 倍でしか実行されないように見えることです。これは、各コアへの行の割り当てが非効率的であることが原因であると推測しています。
たとえば、2 つのコアで 10 行のデータがあり、そのうちの 2 行は 4 時間で実行でき、残りの 2 行は 10 秒かかります。理論的には、これを実行するのに 4 時間 10 秒かかる可能性がありますが、非効率的に割り当てられた場合、8 時間かかる可能性があります。(明らかにこれは誇張ですが、より多くのコアとより多くの行で見積もりが正しくない場合、同様の状況が発生する可能性があります)
これらの時間を見積もり、正しい順序であると見積もった順序で clusterApplyLB に送信すると (所要時間を最小限に抑えるために見積時間をコア全体に分散させるため)、必要なコアに送信されない可能性があります。私が見積もった時間内に終わらないかもしれないからです。たとえば、2 つのプロセスの所要時間が 10 分と 12 分で、11.6 分と 11.4 秒かかると見積もった場合、行が clusterApplyLB に送信される順序は予想とは異なります。この種のエラーは小さいように見えるかもしれませんが、複数の長時間行を最適化した場合、この順序の混乱により、2 つの 4 時間行が異なるノードではなく同じノードに移動する可能性があります (これにより、私の合計時間)。
TL;DR。私の質問: R 並列処理関数 (たとえば、clusterApplyLB、clusterApply、parApply、または任意の sapply、lapply、または foreach バリアント) にどの行をどのコア/ノードに送信する必要があるかを伝える方法はありますか? 自分が置かれている状況がなくても、これは非常に有益で興味深い情報提供になると思います。