在MongoDB中,如果有數據需要進行插入操作,一種簡單的方法是將每條數據逐條插入,在python的pymongo中便是遍歷我們的數據,然後,對每一條數據insert_one(doc)
,這種方法比較簡單,同時也非常地靈活,但是,對於大批量的數據而言,效率較低。
而另一種方法是,將需要插入的數據整合到一個列表中,然後將這個列表整體地批量插入到數據中,這樣對於大批量的數據而言,效率要高很多。
下面是對於所有數據整體批量插入、逐條數據插入與將數據分成多片進行插入的性能測試。
測試代碼如下:
# -*- coding: utf-8 -*-
import time
from pymongo import MongoClient
# 這裏將測試的數據庫的地址替換爲了*
source_db = MongoClient('mongodb://admin:admin@*.*.*.*:*')['test_db']['test_1_13_1']
target_db_1 = MongoClient('mongodb://admin:admin@*.*.*.*:*')['test_db']['test_1_14_1']
target_db_2 = MongoClient('mongodb://admin:admin@*.*.*.*:*')['test_db']['test_1_14_2']
target_db_3 = MongoClient('mongodb://admin:admin@*.*.*.*:*')['test_db']['test_1_14_3']
# 這裏limit中即爲測試所用的數據量的大小
cursor = source_db.find().limit(10000)
print(cursor.count(True))
tweet_count = 0
doc_list = []
for doc in cursor:
doc = dict(doc)
doc.pop('_id')
doc_list.append(doc)
start_time = time.time()
target_db_1.insert_many(documents=doc_list)
print("批量插入:\t")
print(time.time() - start_time)
start_time = time.time()
for doc in doc_list:
target_db_2.insert_one(doc)
print("逐條插入:\t")
print(time.time() - start_time)
start_time = time.time()
start_index = 0
while start_index < len(doc_list):
target_db_3.insert_many(doc_list[start_index: start_index + 1000])
start_index += 1000
print("分批插入:\t")
print(time.time() - start_time)
這裏的測試環境中,數據庫位於同一內網中,但並不在一個局域網下,連接的帶寬爲100Mbps,同時每條數據大小大約爲及Kb到幾十Kb。
當數據量爲10000次時,多次測試的結果如下:
第一次測試
10000
批量插入:
4.807947158813477
逐條插入:
37.37146472930908
分批插入:
4.637062072753906
第二次測試
10000
批量插入:
3.58172869682312
逐條插入:
42.235028982162476
分批插入:
4.915353536605835
第三次測試
10000
批量插入:
2.094788074493408
逐條插入:
24.227844715118408
分批插入:
1.7485744953155518
當將數據量增加到500000後:
第一次測試:
500000
批量插入:
123.143695831
逐條插入:
1982.03912687
分批插入:
124.674865961
第二次測試:
500000
批量插入:
88.7963249683
逐條插入:
1168.17153597
分批插入:
85.0394408703
經過多次測試,可以看到,批量插入總是比逐條插入的性能高許多。而在批量插入中,將所有數據整體插入,與分批(1000)條插入,性能並不會差距很大,可以視情況使用。