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

Bry*_*yan 5 python mongodb pymongo

是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)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?虫子?我使用这个错误吗?

wow*_*in2 4

我认为发生这种情况是因为insert_manypymongo 需要完整list的操作,而不是iterable. 之后这个列表将被发送到 MongoDB,然后进行处理。

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

这是数据库的正常行为。