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

时间:2016-05-18 08:16:17

标签: python mongodb pymongo

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

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

我的印象是,如果你将生成器传递给insert_many,pymongo将会缓冲'插入16或32mb'?

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

见下文:

示例1 =直插入_many(高内存使用 - 2.625 GB)

示例2 ='缓冲' 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)

有什么想法吗?错误?我使用这个错了吗?

1 个答案:

答案 0 :(得分:0)

我认为发生这种情况是因为pymongo需要insert_many而不是list来完成操作。此列表将被发送到MongoDB之后,它将进行处理。

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

这是数据库的正常行为。