MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Pymongo-Mehrfachverarbeitung

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)