【发布时间】:2017-04-27 12:56:16
【问题描述】:
我必须在 MongoDB 上进行大量插入和更新。
我正在尝试测试多处理来完成这些任务。为此,我创建了这个简单的代码。我的虚拟数据是:
documents = [{"a number": i} for i in range(1000000)]
没有多处理:
time1s = time.time()
client = MongoClient()
db = client.mydb
col = db.mycol
for doc in documents:
col.insert_one(doc)
time1f = time.time()
print(time1f-time1s)
我有 150 秒。
通过多处理,我根据需要定义了以下工作函数,并在Pymongo's FAQs 中进行了描述。
def insert_doc(document):
client = MongoClient()
db = client.mydb
col = db.mycol
col.insert_one(document)
但是,当我运行我的代码时:
time2s = time.time()
pool = mp.Pool(processes=16)
pool.map(insert_doc, documents)
pool.close()
pool.join()
time2f = time.time()
print(time2f - time2s)
我收到一个错误:
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 99] 无法分配请求的地址
在引发错误之前,总共处理了 26447 个文档。这个错误在here 进行了解释,尽管遇到该错误的人没有使用多处理。解决方案是只打开一个 MongoClient,但是当我想做多处理时这是不可能的。有什么解决方法吗?感谢您的帮助。
【问题讨论】: