Вашият код създава нов MongoClient за всеки от милионите документи във вашия пример (точно като въпроса, към който сте се свързали). Това изисква да отваряте нов сокет за всяка нова заявка. Това побеждава обединяването на връзките на PyMongo и освен че е изключително бавно, това също означава, че отваряте и затваряте сокети по-бързо, отколкото вашият TCP стек може да поддържа:оставяте твърде много сокети в състояние TIME_WAIT, така че в крайна сметка да останете без портове.
Можете да създадете по-малко клиенти и следователно да отворите по-малко сокети, ако вмъкнете голям брой документи с всеки клиент:
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)