sql >> Database >  >> NoSQL >> MongoDB

mongodb 4x langzamer dan sqlite, 2x langzamer dan csv?

MongoDB-clients maken verbinding met de servers op de achtergrond. Als u inserts wilt benchmarken, zou een nauwkeurigere test ongeveer als volgt zijn:

with pymongo.MongoClient() as client:
  client['warmup']['warmup'].insert_many(docs)
  db = client['test']
  coll = db['test']
  start = time()
  coll.insert_many(docs)
  end = time()

Houd er rekening mee dat insert_many een bulk-schrijfbewerking uitvoert en dat er limieten zijn voor bulk-schrijfgroottes, in het bijzonder kunnen er slechts 1000 commando's per bulk-schrijfbewerking zijn. Als u 1 miljoen bijlagen verzendt, zou u kunnen kijken naar 2000 splitsingen per bulkschrijf waarbij alle gegevenskopieën betrokken zijn. Test het invoegen van 1000 documenten tegelijk versus andere batchgroottes.

Werktest:



import csv
import sqlite3
import pymongo, random, time

N, M = 1000000, 5
docs = [{'_id':1,'b':2,'c':3,'d':4,'e':5}]*N
i=1
for i in range(len(docs)):
    docs[i]=dict(docs[i])
    docs[i]['_id'] = i
data=[tuple(doc.values())for doc in docs]

with open('test.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter=',')
    start = time.time()
    for i in range(N):
        writer.writerow(data[i])
    end = time.time()
    print('%f' %( end-start))


con = sqlite3.connect('test.db')
con.execute('drop table if exists five')
con.execute('create table five(a, b, c, d, e)')
start = time.time()
con.executemany('insert into five(a, b, c, d, e) values (?,?,?,?,?)', data)


end = time.time()
print('%f' %( end-start))



with pymongo.MongoClient() as client:
  client['warmup']['warmup'].delete_many({})
  client['test']['test'].delete_many({})
  client['warmup']['warmup'].insert_many(docs)
  db = client['test']
  coll = db['test']
  start = time.time()
  coll.insert_many(docs)
  end = time.time()
print('%f' %( end-start))

Resultaten:

risque% python3 test.py
0.001464
0.002031
0.022351

risque% python3 test.py
0.013875
0.019704
0.153323

risque% python3 test.py
0.147391
0.236540
1.631367

risque% python3 test.py
1.492073
2.063393
16.289790

MongoDB is ongeveer 8x de sqlite-tijd.

Wordt dit verwacht? Misschien. De vergelijking tussen sqlite en mongodb onthult niet veel behalve dat sqlite aanzienlijk sneller is. Maar natuurlijk dit wordt verwacht omdat mongodb een client/server-architectuur gebruikt en sqlite een in-process database is, wat betekent:

  • De client moet de gegevens serialiseren om naar de server te verzenden
  • De server moet die gegevens deserialiseren
  • De server moet dan het verzoek ontleden en uitzoeken wat te doen
  • De server moet de gegevens op een schaalbare/gelijktijdige manier schrijven (sqlite gewoon fouten met gelijktijdige schrijffouten van wat ik me ervan herinner)
  • De server moet een antwoord opstellen naar de client, dat antwoord serialiseren en naar het netwerk schrijven
  • Klant moet het antwoord lezen, deserialiseren, controleren op succes

Vergeleken met wat - een in-proces database die geen . doet netwerk i/o?

De fysieke schrijfaanroepen zijn een klein deel van wat er door een moderne database naar de gegevensopslag gaat.

Bovendien zijn er in geen van beide gevallen een miljoen van hen betrokken. Als je naar een bestand schrijft, worden de schrijfacties gebufferd door de standaardbibliotheek van Python voordat ze zelfs naar de kernel worden verzonden - je moet flush() gebruiken na elke regel om daadwerkelijk een miljoen schrijfacties te produceren. In een database worden de schrijfacties op dezelfde manier uitgevoerd, pagina voor pagina en niet voor individuele documenten.




  1. Zoek de collectienaam van document._id in meteor (mongodb)

  2. Willekeurige documenten van MongoDB met spring-data

  3. MongoDB geneste documentvalidatie voor subdocumenten

  4. Hoe documenten uit te sluiten van zoekresultaten met velden die niet aanwezig zijn in de zoekopdracht?