优化 pymongo 中 insert_many() 和 create_index 的性能

Posted

技术标签:

【中文标题】优化 pymongo 中 insert_many() 和 create_index 的性能【英文标题】:optimizing performance for insert_many() and create_index in pymongo 【发布时间】:2021-03-05 15:45:12 【问题描述】:

我是 mongo 和 pymongo 的新手,我有大量数据要插入大约 500 万个文档 代码如下所示:

from pymongo import MongoClient
client = MongoClient('localhost', 27017,w=0)
db = client['emp']
emp_colelction = db['EmpDetails']
.
.(skip over reading in data from the JSON file)
.
emp_data = [
      
        "EmpId": "1",
        "FirstName": "Bob",
        "LastName": "Builder",
        "EmpType": "FullTime",
        "HireDate": "2010-08-17"
        "Hobbys":["baseball", "Basketball", "Netflix", "writing", "Programing"]
       ,
       
        "EmpId": "2",
        "FirstName": "Peter",
        "LastName": "Griffin",
        "EmpType": "PartTime",
        "HireDate": "2019-05-23"
        "Hobbys":["vollyball", "Basketball", "Hulu", "Reading", "Learning"]
       
]

track_insert_time = time.time()

emp_colelction.insert_many(emp_data, ordered=False) 

print("Insertion time: %s"%(time.time()-track_insert_time))

track_index_time = time.time()

emp_collection.create_index(["EmpId", 1])  
  
print("Create index time: %s"%(time.time()-track_index_time)

“爱好”字段可以是任意数量元素的列表,有些元素超过 300 个。

我只是在我的 Macbook pro 13 英寸 2.3 GHz 双核 Intel Core i5、8 GB 2133 MHz LPDDR3 上使用 MongoDB 社区版 我电脑上的时间如下: 插入时间:~90 秒 创建索引时间:~110 秒

插入似乎很慢,因为 python 插入一个文档并在插入下一个文档之前等待 MongoDB 的响应。我仍然是python中的菜鸟,无法编写多线程程序。

有什么想法吗? 我在想也许我一次插入大量数据,而不是尝试一次插入所有数据

【问题讨论】:

【参考方案1】:

通过bulk writes(您似乎已经在使用)插入应该非常有效。

查看服务器上的 CPU 和磁盘使用情况 - 如果服务器有可用的 CPU 但客户端的 CPU 受限,则使用多个客户端会增加吞吐量。但是,对于简单的插入,情况不太可能如此。

对批量写入的一个警告是,驱动程序会自动拆分它们以适应服务器限制(16 MB 文档,48 MB 命令消息)。如果您尝试批量写入真正的大型数组,则一次插入 1000 或 5000 个文档可能会获得更好的性能。

【讨论】:

以上是关于优化 pymongo 中 insert_many() 和 create_index 的性能的主要内容,如果未能解决你的问题,请参考以下文章

pymongo

如何使用 insert_many 安全地忽略重复的键错误

pymongo:文档必须是 dict 的实例

为啥这个 pymongo 子文档找不到工作?

为啥这个 pymongo 子文档找不到工作?

pymongo.errors.BulkWriteError: batch op errors occurred