MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Multielaborazione Pymongo

Il tuo codice crea un nuovo MongoClient per ciascuno dei milioni di documenti nel tuo esempio (proprio come la domanda a cui ti sei collegato). Ciò richiede l'apertura di un nuovo socket per ogni nuova query. Questo sconfigge il pool di connessioni di PyMongo e, oltre ad essere estremamente lento, significa anche che apri e chiudi i socket più velocemente di quanto il tuo stack TCP possa tenere il passo:lasci troppi socket nello stato TIME_WAIT quindi alla fine esaurisci le porte.

Puoi creare meno client, e quindi aprire meno socket, se inserisci un numero elevato di documenti con ciascun 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)