Uw code maakt een nieuwe MongoClient aan voor elk van de miljoen documenten in uw voorbeeld (net als de vraag waarnaar u hebt gelinkt). Hiervoor moet u voor elke nieuwe query een nieuwe socket openen. Dit verslaat PyMongo's pooling van verbindingen, en behalve dat het extreem traag is, betekent het ook dat je sockets sneller opent en sluit dan je TCP-stack kan bijhouden:je laat te veel sockets in de TIME_WAIT-status staan, zodat je uiteindelijk geen poorten meer hebt.
U kunt minder clients maken en dus minder sockets openen als u bij elke client grote aantallen documenten invoegt:
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)