gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:06:22 29 4
gpt4 key购买 nike

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

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

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

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

见下文:

Example1 = straight 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)

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

最佳答案

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

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

这是数据库的正常行为。

关于python - 插入数百万个文档 - mongo/pymongo - insert_many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37293900/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com