插入数百万文档mongo/pymongo insert\u many

2024-09-24 00:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

看来insert\u many没有按预期执行?我注意到即使在给db.col.插入多个,内存使用量仍然激增(这使得插入数百万个文档变得困难——尽管我意识到了这一点系统内存应该是>;集合大小以获得最佳性能,所以实际上这可能不是我应该担心的事?在

我的印象是,如果你通过一个生成器来插入,那么pymongo会把插入“缓冲”到16或32mb的“块”中?在

手动执行此缓冲/分块可以解决此问题。。。在

见下文:

示例1=直接插入多个(内存使用率高-2.625 GB)

Example2='buffered'insert\u 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)

有什么想法吗?缺陷?我用错了吗?在


Tags: 内存inimportchainfordbgeneratemany
1条回答
网友
1楼 · 发布于 2024-09-24 00:25:51

我认为发生这种情况是因为对于insert_many,pymongo需要一个完整的list操作,而不是{}。在这个列表被发送到MongoDB之后,它将被处理。在

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

这是数据库的正常行为。在

相关问题 更多 >