MongoDB क्लाइंट बैकग्राउंड में सर्वर से जुड़ते हैं। यदि आप इंसर्ट को बेंचमार्क करना चाहते हैं, तो अधिक सटीक परीक्षण कुछ इस तरह होगा:
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()
ध्यान रखें कि insert_many एक बल्क राइट करता है और बल्क राइट साइज़ की सीमाएँ हैं, विशेष रूप से प्रति बल्क राइट में केवल 1000 कमांड हो सकते हैं। यदि आप 1 मिलियन इंसर्ट भेज रहे हैं, तो आप प्रति बल्क राइट में 2000 स्प्लिट्स देख सकते हैं, जिसमें सभी डेटा कॉपी शामिल हैं। अन्य बैच आकार बनाम एक बार में 1000 दस्तावेज़ सम्मिलित करने का परीक्षण करें।
कार्य परीक्षण:
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))
परिणाम:
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 लगभग 8x sqlite समय है।
क्या यह अपेक्षित है? शायद। sqlite और mongodb के बीच की तुलना बहुत कुछ प्रकट नहीं करती है, इसके अलावा sqlite स्पष्ट रूप से तेज़ है। लेकिन, स्वाभाविक रूप से, यह अपेक्षित है क्योंकि mongodb क्लाइंट/सर्वर आर्किटेक्चर का उपयोग करता है और sqlite एक इन-प्रोसेस डेटाबेस है, जिसका अर्थ है:
- क्लाइंट को सर्वर को भेजने के लिए डेटा को क्रमबद्ध करना होगा
- सर्वर को उस डेटा को डीसेरियलाइज़ करना होगा
- सर्वर को तब अनुरोध को पार्स करना होता है और यह पता लगाना होता है कि क्या करना है
- सर्वर को डेटा को स्केलेबल/समवर्ती तरीके से लिखने की आवश्यकता है (एसक्लाइट केवल समवर्ती लेखन त्रुटियों के साथ त्रुटियां जो मुझे याद हैं)
- सर्वर को क्लाइंट को वापस प्रतिक्रिया लिखने की जरूरत है, उस प्रतिक्रिया को क्रमबद्ध करें, इसे नेटवर्क पर लिखें
- क्लाइंट को प्रतिक्रिया पढ़ने की जरूरत है, डिसेरिएलाइज करने, सफलता के लिए इसे जांचने की जरूरत है
किसकी तुलना में - एक इन-प्रोसेस डेटाबेस जो कोई भी नहीं करता है नेटवर्क i/o?
फिजिकल राइट कॉल आधुनिक डेटाबेस द्वारा डेटा स्टोरेज में जाने का एक छोटा सा हिस्सा है।
इसके अलावा, किसी भी मामले में उनमें से एक लाख शामिल नहीं है। जब आप फाइल करने के लिए लिखते हैं तो पाइथन की मानक लाइब्रेरी द्वारा लिखने से पहले उन्हें कर्नेल में भेजा जाता है - आपको flush()
का उपयोग करना होगा प्रत्येक पंक्ति के बाद वास्तव में एक लाख लेखन का उत्पादन करने के लिए। डेटाबेस में लेखन समान रूप से पृष्ठ दर पृष्ठ आधार पर किया जाता है, न कि व्यक्तिगत दस्तावेज़ों के लिए।