Din kod skapar en ny MongoClient för vart och ett av de miljoner dokumenten i ditt exempel (precis som frågan du länkade till). Detta kräver att du öppnar en ny socket för varje ny fråga. Detta besegrar PyMongos anslutningspoolning, och förutom att vara extremt långsam betyder det också att du öppnar och stänger sockets snabbare än din TCP-stack kan hänga med:du lämnar för många sockets i TIME_WAIT-läge så att du så småningom får slut på portar.
Du kan skapa färre klienter, och därför öppna färre sockets, om du infogar ett stort antal dokument med varje 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)