MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Multitraitement Pymongo

Votre code crée un nouveau MongoClient pour chacun des millions de documents de votre exemple (tout comme la question à laquelle vous avez lié). Cela vous oblige à ouvrir un nouveau socket pour chaque nouvelle requête. Cela va à l'encontre de la mise en pool des connexions de PyMongo, et en plus d'être extrêmement lent, cela signifie également que vous ouvrez et fermez les sockets plus rapidement que votre pile TCP ne peut le faire :vous laissez trop de sockets dans l'état TIME_WAIT et vous finissez par manquer de ports.

Vous pouvez créer moins de clients, et donc ouvrir moins de sockets, si vous insérez un grand nombre de documents avec chaque client :

import multiprocessing as mp
import time
from pymongo import MongoClient

documents = [{"a number": i} for i in range(1000000)]

def insert_doc(chunk):
    client = MongoClient()
    db = client.mydb
    col = db.mycol
    col.insert_many(chunk)

chunk_size = 10000

def chunks(sequence):
    # Chunks of 1000 documents at a time.
    for j in range(0, len(sequence), chunk_size):
        yield sequence[j:j + chunk_size]

time2s = time.time()
pool = mp.Pool(processes=16)
pool.map(insert_doc, chunks(documents))
pool.close()
pool.join()
time2f = time.time()
print(time2f - time2s)