最近シェルとPyMongoを介してMongoDBのテストを開始しました。私は、カーソルを戻してそれを反復しようとすると実際の反復でボトルネックに見えることに気付きました。反復中に複数のドキュメントを返す方法はありますか?PyMongo - カーソルの反復
擬似コード:
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)
私はすべてのthis questionごとにBATCH_SIZE()を使用して、値を変更してみました1000000までの方法ですが、それは何の効果もないようです(または私は間違っています)。
ご協力いただきまして誠にありがとうございます。このMongo初心者で簡単にしてください!
--- EDIT ---
ありがとうございますCaleb。私はあなたが本当に尋ねようとしていたことを指摘したと思います。これは:collection.findAll()
またはcursor.fetchAll()
コマンドのようなものがありますか?cx_Oracleモジュールがありますか?問題は、データを保存するのではなく、Mongo DBからできるだけ早く検索することです。
Mongoが各レコードをシングルフェッチしなければならないので、データが私に返される速度は私のネットワークによって決まります。 、基本的に
# 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を持っているとして、次のことができるようにする必要があります
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
代わりに、のようなもの:
繰り返しごとに1レコードしか戻すことができません。 'batch_size'メソッドを使うと、一度にフェッチするレコードの数を内部的にカーソルに伝えます。だから、反復(およびフェッチではない)がボトルネックであれば、リストの理解を試すことができます。フェッチしたレコードのカーソルに内部メモリの上限が4MBあるとします。 – cpburnz
私はまったく同じ問題を抱えています。私はmongo(そしてPythonについてはそのことが初めてです)です。私はすべての提案は、それらのさまざまなpython関数がmongoとまったく同じ方法でインターフェイスしているため、毎回まったく同じ結果が得られるという意味で、本質的に同等であると思います。あるいは、言い換えれば、mongoはこれらのアプローチの違いを知ることはできません。関連する限り、find()リクエストを行い、カーソルを "n"回要求しました。 – Landon
@ Valdog21、これは1年以上前ですが、どのようにしてこれを最終的に解決しましたか? – Landon