python批量寫入MongoDB數據庫


需要批量操作時候,節省網絡連接交互次數,可以使用 bulk_write。
方法一:批量插入insert_many

arr = []  # 初始化一個空列表
for line in mmap_lines(file_path):
    arr.append(DbPushPortraitObject(uid=uid, hash_key=hash_key, tag_ids=tag_ids, dt=dt))  # 每次往列表里插DbPushPortraitObject對象
    if num % 10000 == 0: # 每次批量插入的數量,10000條插入一次
        #print(arr)
        DbPushPortraitObject.collection.insert_many(arr)
        arr = []
        print("num:%d mid: %s" % (num, datetime.datetime.now()))
    else:
        continue
DbPushPortraitObject.collection.insert_many(arr)

方法二:批量更新bulk_write(UpdateOne)

arr = []  # 初始化一個空列表
for line in mmap_lines(file_path):
    one = UpdateOne({"uid": uid}, {"$set": {"hash_key": hash_key, "tag_list": tag_ids, "dt": dt}}, upsert=True) # 每次往列表里插UpdateOne對象
    arr.append(one)
    if num % 50000 == 0:  # 每次批量插入的數量,50000條插入一次 
        DbPushPortraitObject.collection.bulk_write(arr)   
        arr = []   
        print("num:%d mid: %s" % (num, datetime.datetime.now()))
    else:    
        continue
DbPushPortraitObject.collection.bulk_write(arr)
  • bulk_write定義
db.collection.bulkWrite()

提供可控執行順序的批量寫操作。
語法格式如下:

db.collection.bulkWrite(
   [ <operation 1>, <operation 2>, ... ],
   {
      writeConcern : <document>,
      ordered : <boolean>
   }
)


方法返回值:

  • 操作基於 write concern 運行則 acknowledged 值為true,如果禁用 write concern 運行則 acknowledged 值為false。
  • 每一個寫操作數。
  • 成功 inserted 或 upserted文檔的 _id 的組數。

性能測試
批量更新現在采用的是每5萬條進行一次批量更新,更新的效率:2.3255s/每萬條
更新的效率還會跟索引數,表collection中原始數據的規模等有關。

轉載:https://blog.csdn.net/nihaoxiaocui/article/details/95060906


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM