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.