आपका कोड आपके उदाहरण में लाखों दस्तावेज़ों में से प्रत्येक के लिए एक नया MongoClient बनाता है (ठीक उसी तरह जैसे कि आपने जिस प्रश्न से लिंक किया है)। इसके लिए आपको प्रत्येक नई क्वेरी के लिए एक नया सॉकेट खोलना होगा। यह पायमोंगो के कनेक्शन पूलिंग को हरा देता है, और बेहद धीमी गति से होने के अलावा, इसका मतलब यह भी है कि आप अपने टीसीपी स्टैक की तुलना में तेजी से सॉकेट खोलते और बंद करते हैं:आप 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)