Pymongo散装插入物



我试图批量插入文档。但是在批量插入过程中,它不会插入超过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()

最新更新