加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 插入数百万个文档 – mongo / pymongo – insert_many

发布时间:2020-12-20 13:12:13 所属栏目:Python 来源:网络整理
导读:mongo / pymongo新手. 目前使用最新的–v3.2.2 看起来insert_many没有按预期执行?我注意到即使在向db.col.insert_many提供生成器时,内存使用率仍然高峰(这使得插入数百万个文档变得困难 – 尽管我确实知道sys.mem应该是集合大小以获得最佳性能,所以在现实也
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.

这是数据库的正常行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读