24

最近、シェルと PyMongo を介して MongoDB のテストを開始しました。カーソルを返し、それを反復しようとすると、実際の反復でボトルネックになるように見えることに気付きました。反復中に複数のドキュメントを返す方法はありますか?

擬似コード:

for line in file:
    value = line[a:b]
    cursor = collection.find({"field": value})
    for entry in cursor:
        (deal with single entry each time)

私がやりたいことは次のようなものです:

for line in file
    value = line[a:b]
    cursor = collection.find({"field": value})
    for all_entries in cursor:
        (deal with all entries at once rather than iterate each time)

この質問に従って batch_size() を使用し、値を 1000000 まで変更しようとしましたが、効果がないようです (または間違っています)。

どんな助けでも大歓迎です。このMongoの初心者を気楽にしてください!

- - 編集 - -

ありがとうカレブ。私が実際に尋ねようとしていたことを指摘したと思いますが、これは次のとおりです。cx_Oracleモジュールの場合のように、並べ替えcollection.findAll()またはおそらくコマンドを実行する方法はありますか? cursor.fetchAll()問題はデータを保存することではなく、Mongo DB からデータをできるだけ速く取得することです。

私の知る限り、Mongo は各レコードを 1 つずつ取得する必要があるため、データが返される速度はネットワークによって決まりますね。

4

4 に答える 4

17

次のようなアプローチを検討しましたか。

for line in file
  value = line[a:b]
  cursor = collection.find({"field": value})
  entries = cursor[:] # or pull them out with a loop or comprehension -- just get all the docs
  # then process entries as a list, either singly or in batch

または、次のようにします。

# same loop start
  entries[value] = cursor[:]
# after the loop, all the cursors are out of scope and closed
for value in entries:
  # process entries[value], either singly or in batch

基本的に、結果セットを格納するのに十分な RAM がある限り、カーソルからそれらを引き出して、処理する前にそれらを保持できるはずです。これにより大幅に高速化される可能性はありませんが、特にカーソルの速度低下が軽減され、設定されている場合はデータを並行して処理できるようになります。

于 2011-07-13T15:48:04.457 に答える
15

あなたも試すことができます:

results = list(collection.find({'field':value}))

これにより、すべてが RAM にロードされます。

または、これはおそらく、file大きすぎない場合です。

values = list()
for line in file:
    values.append(line[a:b])
results = list(collection.find({'field': {'$in': values}}))
于 2011-07-13T19:43:18.910 に答える