sql >> Databasteknik >  >> NoSQL >> MongoDB

Pymongo multiprocessing

Din kod skapar en ny MongoClient för vart och ett av de miljoner dokumenten i ditt exempel (precis som frågan du länkade till). Detta kräver att du öppnar en ny socket för varje ny fråga. Detta besegrar PyMongos anslutningspoolning, och förutom att vara extremt långsam betyder det också att du öppnar och stänger sockets snabbare än din TCP-stack kan hänga med:du lämnar för många sockets i TIME_WAIT-läge så att du så småningom får slut på portar.

Du kan skapa färre klienter, och därför öppna färre sockets, om du infogar ett stort antal dokument med varje klient:

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. Uppdatering av inbäddad dokumentegenskap i Mongodb

  2. JavaScript-designmönster -- Hanterar oönskad asynkroni

  3. MongoDB fragmenterad samling balanserar inte om

  4. Meteor.js möjligt med Cassandra istället för MongDB?