Kode Anda membuat MongoClient baru untuk masing-masing dari jutaan dokumen dalam contoh Anda (seperti pertanyaan yang Anda tautkan). Ini mengharuskan Anda untuk membuka soket baru untuk setiap kueri baru. Ini mengalahkan penyatuan koneksi PyMongo, dan selain menjadi sangat lambat, ini juga berarti Anda membuka dan menutup soket lebih cepat daripada yang dapat dipertahankan oleh tumpukan TCP:Anda meninggalkan terlalu banyak soket dalam status TIME_WAIT sehingga Anda akhirnya kehabisan port.
Anda dapat membuat lebih sedikit klien, dan karenanya membuka lebih sedikit soket, jika Anda memasukkan sejumlah besar dokumen dengan setiap klien:
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)