MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wieloprzetwarzanie Pymongo

Twój kod tworzy nowego MongoClient dla każdego z miliona dokumentów w twoim przykładzie (tak jak w pytaniu, do którego się połączyłeś). Wymaga to otwarcia nowego gniazda dla każdego nowego zapytania. Pokonuje to buforowanie połączeń PyMongo, a oprócz tego, że jest bardzo powolne, oznacza to również, że otwierasz i zamykasz gniazda szybciej niż twój stos TCP może nadążyć:pozostawiasz zbyt wiele gniazd w stanie TIME_WAIT, więc w końcu zabraknie Ci portów.

Możesz utworzyć mniej klientów, a tym samym otworzyć mniej gniazd, jeśli wstawisz dużą liczbę dokumentów do każdego klienta:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak I i NIE w wyszukiwaniu $text w MongoDB

  2. jak ustawić mongod --dbpath

  3. Jak szybko pobrać wszystkie dokumenty MongoDB pymongo

  4. How-to:Użytkownik ma fanów

  5. mangusta aktualizująca pole w MongoDB nie działa