2012-02-21 18 views
0

MongoDBで長時間実行しているmapreduce操作を複数回実行していて、その操作のためにopidを取得したいと考えています。 C#ドライバを使用すると、MapReduce呼び出しがブロックされているため、操作が完了した後に戻ります。MongoDB MapReduce opidを調べる

私は進捗状況を確認できるようにmapreduce操作にタグを付けることができます。瞬時に考えることができる唯一の方法は、ユニークな識別子を持つjavascript変数を作成し、db.currentOpの出力を反復することですその変数のために。それを行う良い方法はありますか?問題の

コード:

:私はやってよう なるか

MongoCollection<BsonDocument> logCollection = database.GetCollection<BsonDocument>("source_collection"); 

BsonJavaScript map = new BsonJavaScript(@"function() { //map  }"); 
BsonJavaScript reduce = new BsonJavaScript(@"function(key,values){ //reduce }"); 

var builder = new MapReduceOptionsBuilder(); 
builder.SetOutput("output_collection"); 

MapReduceResult mapReduceResult = logCollection.MapReduce(map, reduce, builder); //<--- Blocks until the mapreduce job completes 

は(作っMapReduceJobクラスに注意してください)非同期ジョブとしてのMapReduceを提出し、それはそうのような実行時にその進捗状況を確認しています

MongoCollection<BsonDocument> logCollection = database.GetCollection<BsonDocument>("source_collection"); 

BsonJavaScript map = new BsonJavaScript(@"function() { //map  }"); 
BsonJavaScript reduce = new BsonJavaScript(@"function(key,values){ //reduce }"); 

var builder = new MapReduceOptionsBuilder(); 
builder.SetOutput("output_collection"); 

MapReduceJob job = logCollection.StartMapReduce(map, reduce, builder); //<--- Returns straight away 

while (true) 
{ 
    Thread.Sleep(1000); 
    var operationDoc = database.GetCurrentOp(); 
    var operations = operationDoc["inprog"].AsBsonArray; 
    var thisOperation = operations.FirstOrDefault(op => op["opid"] == job.OpId); 
    if (thisOperation == null) 
     break; 
    } 
} 

答えて

0

MapReduceJobをブロックマップreduce callを実行するための新しいスレッドを作成することはどうですか?完了したかどうかを示す適切に同期されたフラグを維持することによって、マップがジョブの終了を減らすかどうかを簡単に知ることができます。

+0

ジョブがタイムアウトを過ぎて実行されると、MapReduce呼び出しはタイムアウト例外をスローしますが、ジョブは引き続き実行されます。また、 'currentOp'出力を使って進捗状況を追跡することもできません。 –

+0

この場合、実際にmap reduceジョブの$ cmd.sys.inprogコレクションをポーリングする必要があります。私はC#ドライバのAPIに精通していませんが、js:db.mr.mapReduce(m、r、{out:inline、myTag: 'jobID12'})のように、 )。ただし、これはmとrの関数が小さい場合にのみ機能し、そうでなければ「記録していない(大きすぎる)クエリ」を表示します。 – Ren

関連する問題