sql >> Base de Datos >  >> NoSQL >> MongoDB

Pymongo multiprocesamiento

Su código crea un nuevo MongoClient para cada uno de los millones de documentos en su ejemplo (al igual que la pregunta a la que se vinculó). Esto requiere que abra un nuevo socket para cada nueva consulta. Esto anula la agrupación de conexiones de PyMongo y, además de ser extremadamente lento, también significa que abre y cierra sockets más rápido de lo que puede mantener su pila TCP:deja demasiados sockets en estado TIME_WAIT, por lo que finalmente se queda sin puertos.

Puede crear menos clientes y, por lo tanto, abrir menos sockets, si inserta una gran cantidad de documentos con cada cliente:

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)