Ihr Code erstellt einen neuen MongoClient für jedes der Millionen Dokumente in Ihrem Beispiel (genau wie die Frage, die Sie verlinkt haben). Dies erfordert, dass Sie für jede neue Abfrage einen neuen Socket öffnen. Dies verhindert das Verbindungspooling von PyMongo und ist nicht nur extrem langsam, sondern bedeutet auch, dass Sie Sockets schneller öffnen und schließen, als Ihr TCP-Stack mithalten kann:Sie lassen zu viele Sockets im TIME_WAIT-Zustand, sodass Ihnen schließlich die Ports ausgehen.
Sie können weniger Clients erstellen und daher weniger Sockets öffnen, wenn Sie bei jedem Client eine große Anzahl von Dokumenten einfügen:
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)