Mã của bạn tạo một MongoClient mới cho mỗi triệu tài liệu trong ví dụ của bạn (giống như câu hỏi bạn đã liên kết đến). Điều này yêu cầu bạn mở một ổ cắm mới cho mỗi truy vấn mới. Điều này đánh bại tính năng tổng hợp kết nối của PyMongo và ngoài việc cực kỳ chậm, nó cũng có nghĩa là bạn mở và đóng các ổ cắm nhanh hơn mức ngăn xếp TCP của bạn có thể theo kịp:bạn để quá nhiều ổ cắm ở trạng thái TIME_WAIT nên cuối cùng bạn sẽ hết cổng.
Bạn có thể tạo ít máy khách hơn và do đó mở ít ổ cắm hơn, nếu bạn chèn số lượng lớn tài liệu với mỗi máy khách:
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)