私はpymongoを使用して1つのクエリで約2Mのドキュメントをフェッチしています。各ドキュメントには3つの文字列フィールドしか含まれていません。クエリは、limit()やbatchSize()のない単純なfind()です。
カーソルを繰り返し処理しているときに、約25,000のドキュメントを処理した後、スクリプトが約30〜40秒待機していることに気付きました。
だから私はmongoが2Mの結果をすべて1つのバッチで返すのだろうか? pymongoのデフォルトのbatchSize()は何ですか?
MongoDBのカーソルは、デフォルトで最大101個のドキュメントを返すか、1 MBに達するのに十分です。 4MBまでポップアップした後、カーソルを介して反復する呼び出し。返されるドキュメントの数は、ドキュメントの大きさの関数になります。
カーソルバッチ
MongoDBサーバーはクエリ結果をバッチで返します。バッチサイズは最大BSONドキュメントサイズを超えません。ほとんどのクエリでは、最初のバッチは101ドキュメントまたは1メガバイトを超えるのに十分なドキュメントを返します。後続のバッチサイズは4メガバイトです。バッチのデフォルトサイズをオーバーライドするには、batchSize()およびlimit()を参照してください。
インデックスなしのソート操作を含むクエリの場合、サーバーはソートを実行するためにメモリ内のすべてのドキュメントをロードする必要があり、最初のバッチですべてのドキュメントを返します。
カーソルを反復処理して返されたバッチの最後に到達すると、さらに結果がある場合、cursor.next()はgetmore操作を実行して次のバッチを取得します。
http://docs.mongodb.org/manual/core/cursors/
カーソルのpymongoでbatch_size()メソッドを使用してデフォルトを上書きできますが、16 MB(最大BSONドキュメントサイズ)を超えることはありません。
batch_size(batch_size)
1つのバッチで返されるドキュメントの数を制限します。各バッチには、サーバーへの往復が必要です。パフォーマンスを最適化し、データ転送を制限するために調整できます。
注意
batch_sizeは、単一のバッチでクライアントに返されるデータ量に対するMongoDBの内部制限を上書きできません(つまり、バッチサイズを1,000,000,000に設定した場合、MongoDBは現在、バッチごとに4〜16 MBの結果のみを返します)。
Batch_sizeが整数でない場合、TypeErrorを発生させます。 batch_sizeが0より小さい場合はValueErrorを発生させます。このCursorがすでに使用されている場合はInvalidOperationを発生させます。このカーソルに適用された最後のbatch_sizeが優先されます。パラメーター :
batch_size:リクエストされた結果の各バッチのサイズ。
http://api.mongodb.org/python/current/api/pymongo/cursor.html