MongoDB中的批量插入的使用方法及與逐條插入的性能比較

在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)條插入,性能並不會差距很大,可以視情況使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章