sql >> Databáze >  >> NoSQL >> MongoDB

mongodb 4x pomalejší než sqlite, 2x pomalejší než csv?

Klienti MongoDB se připojují k serverům na pozadí. Pokud chcete porovnávat vložky, přesnější test by byl něco takového:

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

Mějte na paměti, že insert_many provádí hromadný zápis a existují omezení na velikosti hromadného zápisu, konkrétně může být pouze 1000 příkazů na hromadný zápis. Pokud posíláte 1 milion příloh, můžete se dívat na 2 000 rozdělení na hromadný zápis, které všechny zahrnují kopie dat. Otestujte vložení 1000 dokumentů najednou v porovnání s jinými velikostmi dávky.

Funkční test:

import csvimport sqlite3import pymongo, random, timeN, M =1000000, 5docs =[{'_id':1,'b':2,'c':3,'d':4,'e' :5}]*Ni=1for i v rozsahu(len(docs)):docs[i]=dict(docs[i]) docs[i]['_id'] =idata=[tuple(doc.values() )for doc in docs]s open('test.csv', 'w', newline='') jako soubor:Writer =csv.writer(file, delimiter=',') start =time.time() for i v rozsahu(N):write.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) hodnoty (?,?,?,?,?)', data)end =time.time()print('%f' %( end-start))s pymongo.MongoClient() jako klientem :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' %( e nd-start)) 

Výsledky:

risque% python3 test.py0.0014640.0020310,022351risque% python3 test.py0.0138750101,63130301010133030101010130301010101930301010130303010101333303010130.

MongoDB je asi 8x delší než sqlite čas.

Očekává se to? Možná. Srovnání mezi sqlite a mongodb nic moc neprozradí, kromě toho, že sqlite je výrazně rychlejší. Ale přirozeně toto se očekává, protože mongodb využívá architekturu klient/server a sqlite je databáze v procesu, což znamená:

  • Klient musí serializovat data pro odeslání na server
  • Server musí tato data deserializovat
  • Server pak musí požadavek analyzovat a zjistit, co má dělat
  • Server potřebuje zapisovat data škálovatelným/souběžným způsobem (sqlite prostě chyby s chybami souběžného zápisu z toho, co si pamatuji)
  • Server potřebuje sestavit odpověď zpět klientovi, serializovat tuto odpověď a zapsat ji do sítě
  • Klient si musí odpověď přečíst, deserializovat a zkontrolovat, zda je úspěšná

V porovnání s čím - rozpracovaná databáze, která nedělá žádné síťové i/o?

Fyzická volání zápisu jsou malou částí toho, co jde do ukládání dat moderní databází.

Kromě toho ani jeden případ nezahrnuje milion z nich. Když zapisujete do souboru, zápisy jsou ukládány do vyrovnávací paměti standardní knihovnou pythonu ještě předtím, než jsou odeslány do jádra - musíte použít flush() po každém řádku skutečně vyprodukovat milion zápisů. V databázi se zápisy podobně provádějí na základě stránky po stránce a nikoli pro jednotlivé dokumenty.




  1. Jak zjistím, zda je serializátor mongodb již zaregistrován?

  2. MongoDB odlišná agregace

  3. Dotaz Mongo $exists nevrací správné dokumenty

  4. Ignorujte připojení soketu MongoDB na Spring Test