MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Multiprocessamento Pymongo


Seu código cria um novo MongoClient para cada um dos milhões de documentos em seu exemplo (assim como a pergunta à qual você vinculou). Isso requer que você abra um novo soquete para cada nova consulta. Isso anula o pool de conexões do PyMongo e, além de ser extremamente lento, também significa que você abre e fecha soquetes mais rápido do que sua pilha TCP pode acompanhar:você deixa muitos soquetes no estado TIME_WAIT e, eventualmente, fica sem portas.

Você pode criar menos clientes e, portanto, abrir menos soquetes, se inserir um grande número de documentos com 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)