foreachとdoRedisを使用すると、doRedisワーカーは処理を開始する前にすべてのジョブがredisサーバーに到達するまで待機します。すべての前処理が完了する前に開始することは可能ですか?doRedisワーカーは、すべてのジョブがredisサーバーに入るまで処理を開始しません。
私は偉大な作業をしているイテレーターを使用しています - 前処理が「ちょうどよい時」に起こり、イテレーターが実行されるときにジョブデータがサーバーにヒットし始めます。しかし、私はこの行動を利用するようには思えません。なぜなら、労働者はすべての仕事がアップロードされるまで待つからです。
例コード:
library(foreach)
library(doRedis)
registerDoRedis("worklist", "0.0.0.0")
foreach (var = complex.iter(1:1E6)) %dopar% {
process.function(var)
}
この例でcomplex.iter
は時間がかかるし、反復処理するための多くの要素があります。このように、すべての前処理が完了する前に、労働者がprocess.function()
を実行し始めた場合は素晴らしいでしょう。残念ながら、彼らはcomplex.iter
がすべての要素で実行されるまで待つようです。
.inorder=F
と設定しました。
どのようにこの希望の動作を達成するための任意の提案ですか?ありがとう。
ロードバランシングは問題ありません。この問題は、リモートワーカーが処理ジョブを開始するときに発生します。 – nate
関数内で反復が行われています(foreachは閉じた環境を作成しています)。ファンクションを完了前にデータをプッシュしない限り、パラレルコアが割り当てられているかどうかに関わらず、Redisタスクでは利用できません。その環境内のデータをどのように管理し、プロセスを同時に実行するかを判断する必要がある場合や、Redisスクリプトを関数に含める必要がある場合は、段階的にプッシュアウトする必要があります。 – sconfluentus
データが直ちに赤く点灯しています。例えば、上記の '' var''や '' process.function(var) 'のような実行するコードを繰り返し処理するチャンクです。それは問題ではありません。 – nate