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

Pymongo multiprocessing

Din kode opretter en ny MongoClient for hver af de millioner dokumenter i dit eksempel (ligesom det spørgsmål, du linkede til). Dette kræver, at du åbner en ny socket for hver ny forespørgsel. Dette besejrer PyMongos forbindelsespooling, og udover at være ekstremt langsom, betyder det også, at du åbner og lukker sockets hurtigere, end din TCP-stak kan følge med:du efterlader for mange sockets i TIME_WAIT-tilstand, så du til sidst løber tør for porte.

Du kan oprette færre klienter og derfor åbne færre sockets, hvis du indsætter et stort antal dokumenter med hver klient:

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)



  1. Oprettelse af en nummereret liste for meteordata

  2. Mongoose:valideringsfejlsti er påkrævet

  3. Gør django med mongodb migrationer til fortiden?

  4. Mongodb Mongoimport for stor:Fejl ved parsing