2016-08-05 5 views
0

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と設定しました。

どのようにこの希望の動作を達成するための任意の提案ですか?ありがとう。

答えて

0

あなたはそれが気分が悪くなるようにいくつかのことを試すことができます。 1つはチャンクサイズを設定し、もう1つはローカルの作業者がバックグラウンドで作業を開始することです。

[ここでこの2つの機能が適切に使用されている方法を説明するPDFへのリンクがある]データ、機能やタスクの詳細情報がない

startLocalWorkers & setChunkSize

これ以上あなたを助けることは困難ですそれよりも。

答えはノー、イテレータが労働者に雇用をアップロードし、配布する前に、すべてのタスクデータの集約を完了し、現在、次のとおりです。ケースの他に

+0

ロードバランシングは問題ありません。この問題は、リモートワーカーが処理ジョブを開始するときに発生します。 – nate

+0

関数内で反復が行われています(foreachは閉じた環境を作成しています)。ファンクションを完了前にデータをプッシュしない限り、パラレルコアが割り当てられているかどうかに関わらず、Redisタスクでは利用できません。その環境内のデータをどのように管理し、プロセスを同時に実行するかを判断する必要がある場合や、Redisスクリプトを関数に含める必要がある場合は、段階的にプッシュアウトする必要があります。 – sconfluentus

+0

データが直ちに赤く点灯しています。例えば、上記の '' var''や '' process.function(var) 'のような実行するコードを繰り返し処理するチャンクです。それは問題ではありません。 – nate

0

は、同じ質問を持っています。ここでの関連する議論:https://github.com/bwlewis/doRedis/issues/39

データがアップロードされる前にイテレータが完了しているという点で私の質問に間違っていました。それでも、ブロッキングアップロードでは、イテレータが終了するまで待機するのではなく、アップロードが完了するまで待機します。

変更を加えると答えが更新されます。

関連する問題