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)
有任何想法吗?虫子?我使用这个错误吗?
我认为发生这种情况是因为insert_manypymongo 需要完整list的操作,而不是iterable. 之后这个列表将被发送到 MongoDB,然后进行处理。
insert.insert_many)。这是数据库的正常行为。