sql >> Databáze >  >> NoSQL >> MongoDB

Multiprocessing Pymongo

Váš kód vytvoří nový MongoClient pro každý z milionů dokumentů ve vašem příkladu (stejně jako otázka, na kterou jste odkazovali). To vyžaduje, abyste pro každý nový dotaz otevřeli nový soket. To maří sdružování připojení PyMongo a kromě toho, že je extrémně pomalé, to také znamená, že otevíráte a zavíráte sokety rychleji, než váš zásobník TCP stihne:příliš mnoho soketů necháváte ve stavu TIME_WAIT, takže vám nakonec dojdou porty.

Pokud s každým klientem vložíte velké množství dokumentů, můžete vytvořit méně klientů, a tedy otevřít méně soketů:

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)



  1. Doktrína MongoDB najít podle id

  2. NodeJS + Mongo:Vložit, pokud neexistuje, jinak - aktualizovat

  3. Nahrajte data do Meteor / Mongo DB

  4. Mongoose &jedinečné pole