Pymongo散装插件

时间:2014-02-02 19:13:18

标签: python mongodb pymongo

我正在尝试批量插入文档。但它在批量插入期间不会插入超过84个文档。 给我这个错误:

in insert pymongo.errors.InvalidOperation: cannot do an empty bulk insert

是否可以进行批量插入,例如每次插入插入50个文档?

4 个答案:

答案 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()