MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Мултипроцесор на Pymongo

Вашият код създава нов MongoClient за всеки от милионите документи във вашия пример (точно като въпроса, към който сте се свързали). Това изисква да отваряте нов сокет за всяка нова заявка. Това побеждава обединяването на връзките на PyMongo и освен че е изключително бавно, това също означава, че отваряте и затваряте сокети по-бързо, отколкото вашият TCP стек може да поддържа:оставяте твърде много сокети в състояние TIME_WAIT, така че в крайна сметка да останете без портове.

Можете да създадете по-малко клиенти и следователно да отворите по-малко сокети, ако вмъкнете голям брой документи с всеки клиент:

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. res.redirect показва стара информация след изпращане на формуляр?

  2. Търсенето на пълен текст в MongoDB не дава очаквания резултат за @@@

  3. Mongo DB намира всички записи с най-висока стойност в зависимост от ключово поле

  4. Търсете множество полета за множество стойности в MongoDB

  5. Заявка за получаване на стойност чрез изваждане на стойност от текущия и следващия документ