优化 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 的性能的主要内容,如果未能解决你的问题,请参考以下文章