运维开发网

在Python中插入数百万个文档 – mongo / pymongo – insert_many

运维开发网 https://www.qedev.com 2020-04-13 11:46 出处:网络 作者:运维开发网整理
mongo / pymongo新手. 目前使用最新的–v3.2.2 看起来insert_many没有按预期执行?我注意到即使在向db.col.insert_many提供生成器时,内存使用率仍然高峰(这使得插入数百万个文档变得困难 – 尽管我确实知道sys.
mongo / pymongo新手.

目前使用最新的–v3.2.2

看起来insert_many没有按预期执行?我注意到即使在向db.col.insert_many提供生成器时,内存使用率仍然高峰(这使得插入数百万个文档变得困难 – 尽管我确实知道sys.mem应该是>集合大小以获得最佳性能,所以在现实也许这不是我应该担心的事情?

我的印象是,如果你将生成器传递给insert_many,pymongo会将插件“缓冲”到16或32mb’块’中?

手动执行此缓冲/分块可解决问题……

见下文:

Example1 =直插入_many(高内存使用 – 2.625 GB)

Example2 =’buffered’insert_many(预计[低]内存使用量 – 约300 MB)

import itertools
from itertools import chain,islice
import pymongo

client = pymongo.MongoClient()
db=client['test']

def generate_kv(N):
    for i in range(N):
        yield {'x': i}

print "example 1"
db.testcol.drop()
db.testcol.insert_many(generate_kv(5000000))

def chunks(iterable, size=10000):
        iterator = iter(iterable)
        for first in iterator:
            yield chain([first], islice(iterator, size - 1))

print "example 2"
db.testcol.drop()
for c in chunks(generate_kv(5000000)):
        db.testcol.insert_many(c)

有任何想法吗?错误?我用错了吗?

我认为这是因为insert_many pymongo需要有一个完整的操作列表,而不是可迭代的.此列表将被发送到MongoDB之后,它将被处理.

>如果您想/需要使用iterable(例如,长文档生成) – 您可以使用简单插入.

>如果您有大量适合RAM的文档 – 您可以发送批量插入(insert_many).

>在其他情况下 – 只需将最大的块分开即可发送到MongoDB.

这是数据库的正常行为.

0

精彩评论

暂无评论...
验证码 换一张
取 消