最近、シェルと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は各レコードをシングルフェッチする必要があるため、データが返される速度はネットワークによって決まります。
次のようなアプローチを検討しましたか?
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がある限り、処理前にそれらをカーソルから引き離して保持することができるはずです。これは大幅に速くなる可能性は低いです。 、ただし、特にカーソルの速度低下を緩和し、データを並列処理できるように設定されている場合は、並列処理することができます。
あなたも試すことができます:
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}}))
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では実装されていません...