Pymongo批量插入

2024-05-09 20:23:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图批量插入文档。但在批量插入过程中插入的文档不超过84个。 给我这个错误:

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

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


Tags: in文档an过程错误bulk批量do
3条回答

游戏进行到很晚,但在这里描述的批量操作(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

已经在这里回答了:Mongodb bulk insert limit in Python

你不需要做批量插入。只需执行insert迭代,Pymongo将负责将数据分块到最大字节大小,或收集插入的数据一段时间,直到达到最大字节大小,然后再将其批量插入数据库。

Mongodb本身有一个消息大小限制(maxMessageSizeBytes),即等于48000000字节(maxBsonObjectSize*3)。

签出the documentation for bulk inserts in PyMongo。您只需传递一个要插入的dict列表。如果列表为空,PyMongo会引发一个异常,正如您所观察到的。

相关问题 更多 >