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)