我正在尝试批量插入文档。但它在批量插入期间不会插入超过84个文档。 给我这个错误:
in insert pymongo.errors.InvalidOperation: cannot do an empty bulk insert
是否可以进行批量插入,例如每次插入插入50个文档?
答案 0 :(得分:6)
结帐the documentation for bulk inserts in PyMongo。您只需将一个dicts列表传递给insert()。如果列表为空,则PyMongo会引发异常,正如您所观察到的那样。
答案 1 :(得分:0)
这里已经回答:Mongodb bulk insert limit in Python
你真的不需要批量插入。只需进行插入迭代,Pymongo将负责将数据分块为最大字节大小或收集插入的数据一段时间,直到它达到最大字节大小,然后再将其大量插入数据库。
Mongodb本身有一个消息大小限制(maxMessageSizeBytes),等于48000000字节(maxBsonObjectSize * 3)。
答案 2 :(得分:0)
这里游戏的后期,但在这里描述的批量操作(http://api.mongodb.com/python/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
魔法的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
答案 3 :(得分:0)
只需保持一个标志来跟踪天气,即可在批量操作中执行某些操作。因此,您可以避免异常并进行数据库调用。
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()