производительность двигателя mongoDb bulk_write очень медленное обновление - PullRequest
0 голосов
/ 07 апреля 2020


Надеюсь, что кто-то может помочь.
Мне нужно увеличить скорость массового обновления документов. Ниже приведен пример:

from motor.motor_asyncio import AsyncIOMotorClient
from pymongo import UpdateOne

def get_mongodb():
   mongoClient = AsyncIOMotorClient(mongohost, mongoport)
   mongoDb = mongoClient[mongodb]
   mongoCo = mongoDb[mongocol]
   return mongoCo,mongoDb,mongoClient

async def add_details(p):

    mongoCo, mongoDb, mongoClient = get_mongodb() 
    req = [ UpdateOne({'iid': int(i['iid'])}, 
                      {"$addToSet": {
                                     'Mdetails':
                                               {
                                                'details':i, 
                                               },
                                     }

                       }, upsert=True ) for i in p['Items'] ]
    mongoCo.bulk_write(req,ordered=False)

каждый вызов add_details для обновления 10-200 документов.
каждое обновление документа добавляет к Mdetails уникальный встроенный документ.
Работает довольно медленно (занимает почти столько же времени, сколько я делал отдельное обновление для каждого документа.)
Я думал о проблеме с $ addToSet (и, наконец, мне нужны уникальные значения только в Mdetails), для тестирования я изменяю его с помощью $ pu sh, это увеличивает скорость примерно на 20 ~ 30%, но все еще очень медленно, для обновления 10k документа требуется 3-4 минуты. Есть предложения?

...