web-dev-qa-db-ja.com

PyMongo-カーソル反復

最近、シェルと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まで変更しましたが、効果がないようです(または間違っています)。

どんな助けでも大歓迎です。このモンゴ初心者でも安心してください!

---編集---

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

私の知る限り、Mongoは各レコードをシングルフェッチする必要があるため、データが返される速度はネットワークによって決まります。

21
Valdogg21

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

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がある限り、処理前にそれらをカーソルから引き離して保持することができるはずです。これは大幅に速くなる可能性は低いです。 、ただし、特にカーソルの速度低下を緩和し、データを並列処理できるように設定されている場合は、並列処理することができます。

16
jmelesky

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

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}}))
15
Isaac C.

toArray()が解決策になるかもしれません。ドキュメントに基づいて、最初にMongoのすべてのカーソルを反復処理し、結果を配列の形式で1回だけ返します。

http://docs.mongodb.org/manual/reference/method/cursor.toArray/

これは、一度に1つのドキュメントをPython)にフェッチし、Mongoに戻って次のカーソルをフェッチするlist(coll.find())または[doc for doc in coll.find()]とは異なります。

ただし、このメソッドはpyMongoでは実装されていません...

2
MK Yung