我试图批量插入文档。但是在批量插入过程中,它不会插入超过84个文档。给我这个错误:
in insert pymongo.errors.InvalidOperation: cannot do an empty bulk insert
是否可以进行批处理插入,例如每个插入插入50个文档?
查看Pymongo中批量插入的文档。您只需将dicts的列表传递给插入()即可。如果列表为空,则Pymongo会引起例外,如您所观察到的。
在这里游戏迟到,但在此处描述的批量操作方面取得了良好的成功(http://api.mongodb.com/python/current/current/examples/bulk.html)。insert_many()
方法已经在引擎盖下进行了必要的块。我的工作流程涉及一个大的"散装插入",然后涉及许多随后的完整收集更新。使用批量更新过程比循环单个更新快很多倍。但是,速度的百分比根据输入的大小而变化(10、100、1000、1
def unordered_bulk_write():
bulk_op = collection.initialize_unordered_bulk_op()
for primary_key in primary_key_list:
bulk_op.find({'fubar_key': primary_key}).update({'$set': {'dopeness_factor': 'unlimited'}})
try:
bulk_op.execute()
except Exception as e:
print e, e.details
def single_update_write():
for primary_key in primary_key_list:
collection.update_one({'fubar_key': primary_key}, {'$set':
{'dopeness_factor': 'unlimited'}})
这些方法是在带有%%timing
Magic的IPY笔记本中运行的,我得到了以下统计数据。在给定的一块随机选择的主键的地图中,将方法调用。
WITH CHUNK_SIZE = 10
UNORDERED BULK WRITE = 1000 loops, best of 3: 871 µs per loop
SINGLE UPDATE ONE = 100 loops, best of 3: 2.47 ms per loop
WITH CHUNK_SIZE = 100
UNORDERED BULK WRITE = 100 loops, best of 3: 4.57 ms per loop
SINGLE UPDATE ONE = 10 loops, best of 3: 26.2 ms per loop
WITH CHUNK_SIZE = 1000
UNORDERED BULK WRITE = 10 loops, best of 3: 39 ms per loop
SINGLE UPDATE ONE = 1 loops, best of 3: 246 ms per loop
WITH CHUNK_SIZE = 10000
UNORDERED BULK WRITE = 1 loops, best of 3: 399 ms per loop
SINGLE UPDATE ONE = 1 loops, best of 3: 2.58 s per loop
WITH CHUNK_SIZE = 100000
UNORDERED BULK WRITE = 1 loops, best of 3: 4.34 s per loop
SINGLE UPDATE ONE = 1 loops, best of 3: 24.8 s per loop
已经在这里回答:python中的mongodb插件插入限制
您实际上不需要进行批量插入。只需插入迭代,Pymongo将负责将数据分解为最大字节大小或收集插入的数据一段时间,直到在将其插入数据库之前达到最大字节大小为止。
。mongoDB本身具有消息大小限制(maxMessagesizeBytes),等于48000000字节(MaxBsonObjectsize * 3)。
只需维护一个标志即可跟踪天气,在批量操作中可以执行一些事情。因此,您可以避免例外并进行DB调用。
bulk_operation = collection.initialize_unordered_bulk_op()
execute_bulk = False
for _id in _ids:
bulk_operation.find({'_id': _id}).update({'$set': {'key': 'value'}})
execute_bulk = True
if execute_bulk:
bulk_operation.execute()