Máy khách MongoDB kết nối với máy chủ ở chế độ nền. Nếu bạn muốn đo điểm chuẩn, một bài kiểm tra chính xác hơn sẽ là như thế này:
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()
Hãy nhớ rằng insert_many thực hiện ghi hàng loạt và có giới hạn về kích thước ghi hàng loạt, cụ thể là chỉ có thể có 1000 lệnh cho mỗi lần ghi hàng loạt. Nếu bạn đang gửi 1 triệu lần chèn, bạn có thể xem 2000 lần phân chia cho mỗi lần ghi hàng loạt, tất cả đều liên quan đến các bản sao dữ liệu. Thử nghiệm chèn 1000 tài liệu cùng một lúc so với các kích thước hàng loạt khác.
Thử nghiệm làm việc:
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))
Kết quả:
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 bằng khoảng 8x thời gian sqlite.
Điều này có được mong đợi không? Có lẽ. So sánh giữa sqlite và mongodb không tiết lộ nhiều ngoài việc sqlite nhanh hơn rõ rệt. Nhưng, tự nhiên, cái này được mong đợi vì mongodb sử dụng kiến trúc máy khách / máy chủ và sqlite là cơ sở dữ liệu trong quá trình, có nghĩa là:
- Máy khách phải tuần tự hóa dữ liệu để gửi đến máy chủ
- Máy chủ phải giải mã dữ liệu đó
- Sau đó, máy chủ phải phân tích cú pháp yêu cầu và tìm ra những việc cần làm
- Máy chủ cần ghi dữ liệu theo cách có thể mở rộng / đồng thời (sqlite chỉ đơn giản là lỗi với lỗi ghi đồng thời từ những gì tôi nhớ về nó)
- Máy chủ cần soạn phản hồi gửi lại máy khách, tuần tự hóa phản hồi đó, ghi vào mạng
- Khách hàng cần đọc phản hồi, giải mã hóa, kiểm tra xem có thành công không
So với cái gì - cơ sở dữ liệu trong quá trình không làm bất kỳ mạng i / o?
Các lệnh gọi ghi vật lý là một phần nhỏ của những gì được cơ sở dữ liệu hiện đại đưa vào lưu trữ dữ liệu.
Ngoài ra, không có trường hợp nào liên quan đến một triệu người trong số họ. Khi bạn ghi vào tệp, các lần ghi được lưu vào bộ đệm bởi thư viện chuẩn của python trước khi chúng được gửi đến hạt nhân - bạn phải sử dụng flush()
sau mỗi dòng để thực sự tạo ra một triệu lần viết. Trong cơ sở dữ liệu, việc ghi được thực hiện tương tự trên từng trang và không phải đối với các tài liệu riêng lẻ.