Votre code crée un nouveau MongoClient pour chacun des millions de documents de votre exemple (tout comme la question à laquelle vous avez lié). Cela vous oblige à ouvrir un nouveau socket pour chaque nouvelle requête. Cela va à l'encontre de la mise en pool des connexions de PyMongo, et en plus d'être extrêmement lent, cela signifie également que vous ouvrez et fermez les sockets plus rapidement que votre pile TCP ne peut le faire :vous laissez trop de sockets dans l'état TIME_WAIT et vous finissez par manquer de ports.
Vous pouvez créer moins de clients, et donc ouvrir moins de sockets, si vous insérez un grand nombre de documents avec chaque 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)