0

新しい pymongo2.6 では、プロセスを複数のスレッドに分割できます。とても便利だと思います。

from multiprocessing import Pool
import pymongo
connection = pymongo.MongoClient(max_pool_size=8)

def update(id):
  connection.update({"_id":id},{"$set":{"field":"blah_blah"}},upsert=True)

p = Pool(8)
p.map(update,list_of_ids)

これはうまくいきます。しかし、コレクションのクエリを分割できるかどうか疑問に思っていましたか? カーソル オブジェクトが既にチャンクに分割されていることはわかっていますが、スレッドの同時実行性を使用してクエリを高速化する方法はありますか?

何かのようなもの...

list_of_ids = []

def get_ids(chunk_of_cursor):
  for i in chunk_of_cursor:
   list_of_ids.append(i['_id'])

p = Pool(8)
p.map(get_ids,connection.find({"field":"somecriteria"})

とにかく、カーソルオブジェクトをチャンクとして関数に渡します。

J

4

1 に答える 1

2

複数のカーソルでスキップとリミットを使用してクエリを高速化するつもりなら、残念ながら答えはおそらくそうではありません。たとえば、10 個のチャンクで 1000 個の結果を返したい場合、それぞれに 10 個のカーソルをスレッド化すると、100 個の結果が返されます。スキップがサーバー側で実装される方法により、各カーソルが先にスキップするためのオーバーヘッドは、おそらくプーリングの利点を上回ります。

ただし、max_pool_size の新しい実装に関して何を指しているのかわかりません。これは、接続数のハード キャップにすぎません。Pymongo には、複数のスレッドにまたがるプロセスの分割をサポートする特定の機能はありません。

于 2013-09-17T19:49:21.437 に答える