0

私は現在、約 43,000,000 要素の Mongo コレクション全体を通過し、それらの要素に変更を加えずに要素を分析する長時間実行操作 (Python + Celery で実行) を行っています。

このコレクションが大きくなるにつれて、操作に時間がかかるようになり (明らかに)、通常は別のデータベースへのタイムアウトが原因で定期的に失敗しています。

この操作をいくつかの小さな操作 (おそらく数百万の要素で操作) に分割したいと思います。分割を行うクエリを作成する最良の方法について疑問に思っています。このコレクションには 1 つのインデックスしかありません_id

明らかな答えは次のようなものでした。

# This is executed in parallel on different servers
def doAnalysis(skipped,limit) 
    db.<collection>.find().skip(skipped).limit(limit)

...

# This is the parent task
elemsToAnalyze = db.<collection>.find().count()/10;
for i in range(0,10:
    doAnalysis(elemsToAnalyze * i, elemsToAnalyze)

しかし、実際に分析を実行するのと同じくらい長い.skip()時間がかかることが判明しました。これを行うより良い方法はありますか?

4

1 に答える 1

1

skip()この種の場合、非常に遅くなる可能性があります。代わりに、最後_idのバッチを使用して次のバッチをクエリすることにより、範囲クエリを実行できます。このようなもの:

db.<collection>.find({ "_id" : { $gte: prev_batch_last_id } } ).sort( { _id : 1 } ).limit(limit);

バッチの最後の ID を自分で変数に保存する必要があります。

于 2012-05-31T23:11:38.633 に答える