【问题标题】:Pymongo bulk insertsPymongo 批量插入
【发布时间】:2014-02-02 19:13:18
【问题描述】:

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

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

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

【问题讨论】:

  • 当然可以用 PyMongo 做bulk inserts。错误消息表明您的语法可能不太正确。你能分享你的插入代码吗?另外,您使用的是什么版本的 PyMongo 和 Python?
  • Python 是 2.6,Pymongo 2.6.3
  • 如果语法错误,那么它不应该插入任何文档,不是吗?
  • 从您的描述中不清楚您是否能够成功地批量插入 84 个文档(但没有更多),或者仍在尝试这样做。您询问是否可以进行批量插入,这听起来像是您仍在尝试让批量插入工作。 code error 名义上是通过尝试发送一个空批次来触发的。 PyMongo 应该自动将大批量插入拆分成更小的批次,因此发送到服务器的批次大小将取决于您的文档有多大。
  • 如果批量插入 84 个文档有效但 85 个无效.. 您可以尝试插入更大的批次(例如 90 个文档)吗?如果您插入“失败”的批次,是否会添加任何文档?您的批量插入中的第 85 个文档有什么不同(您是否尝试过不将其包含在批处理中)?

标签: python mongodb pymongo


【解决方案1】:

查看the documentation for bulk inserts in PyMongo。您只需将 dicts 列表传递给 insert()。如您所见,如果列表为空,PyMongo 会引发异常。

【讨论】:

    【解决方案2】:

    这里的游戏迟到了,但在此处描述的批量操作方面取得了很好的成功 (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】:

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

      您实际上并不需要进行批量插入。只需进行插入迭代,Pymongo 将负责将数据分块成最大字节大小或收集插入的数据一段时间,直到达到最大字节大小,然后将其批量插入数据库。

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

      【讨论】:

        【解决方案4】:

        只需维护一个标志来跟踪天气,就可以批量执行某些操作。这样您就可以避免异常并进行 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()
        

        【讨论】:

          猜你喜欢
          • 2015-05-16
          • 1970-01-01
          • 2019-02-25
          • 2020-09-02
          • 2017-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多