sql >> Database >  >> NoSQL >> MongoDB

Pymongo multiprocessing

Uw code maakt een nieuwe MongoClient aan voor elk van de miljoen documenten in uw voorbeeld (net als de vraag waarnaar u hebt gelinkt). Hiervoor moet u voor elke nieuwe query een nieuwe socket openen. Dit verslaat PyMongo's pooling van verbindingen, en behalve dat het extreem traag is, betekent het ook dat je sockets sneller opent en sluit dan je TCP-stack kan bijhouden:je laat te veel sockets in de TIME_WAIT-status staan, zodat je uiteindelijk geen poorten meer hebt.

U kunt minder clients maken en dus minder sockets openen als u bij elke client grote aantallen documenten invoegt:

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. Docker-compose - Redis op 0.0.0.0 in plaats van 127.0.0.1

  2. Mongodb groeperen en sorteren

  3. Hoe kan ik subdocumenten uit een array halen?

  4. JSR223 (Groovy) heeft geen toegang tot MongoDB (3.0.3) in Jmeter (2.13)