【问题标题】:inserting millions of documents - mongo / pymongo - insert_many插入数百万个文档 - mongo / pymongo - insert_many
【发布时间】:2016-05-18 08:16:16
【问题描述】:

mongo/pymongo 的新手。 目前使用的是最新的-v3.2.2

insert_many 似乎没有按预期执行?我注意到,即使为 db.col.insert_many 提供生成器,内存使用量仍然会激增(这使得插入数百万个文档变得困难 - 尽管我确实意识到 sys.mem 应该 > 集合大小以获得最佳性能,所以实际上也许这不是我应该担心的?

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

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

见下文:

示例 1 = 直接 insert_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)

有什么想法吗?漏洞?我用错了吗?

【问题讨论】:

  • 如果您在安装了 mongo 和 python 的同一系统上进行此测试 - 您正在自找麻烦 :-)。 1. python 需要为创建的对象分配内存,2. tcp/ip 堆栈需要传输,3. mongo 需要缓冲输入....所以看起来一个对象可以分配 3 次..
  • 绝对。对于这个测试,我确实为 mongo/python 使用了相同的系统(virtualbox 中的简单 VM)。实际上 mongoDB 会在它自己的环境中运行,并且有足够的内存。我的帖子只引用了 python 加载 (pymongo) 脚本的内存使用情况,而不是整个系统的内存使用情况。

标签: python mongodb pymongo


【解决方案1】:

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

  • 如果您想/需要使用可迭代(例如长文档生成)- 您可以使用简单的insert
  • 如果您有大量适合您的 RAM 的文档 - 您可以发送批量插入 (insert_many)。
  • 在其他情况下 - 只需按您可以的最大块拆分并发送到 MongoDB。

这是数据库的正常行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多