【问题标题】:PyMongo Bulk does not return after inserting 12k documents插入 12k 文档后 PyMongo Bulk 不返回
【发布时间】:2017-02-04 00:17:42
【问题描述】:

我在 macOS 上使用 pymongo 3.4 批量插入 12k 大文档。每个文档都是具有 365 个值的时间序列的一部分,因此非常庞大。我正在做这样的事情:

bulk = db.test.initialize_unordered_bulk_op()
for i in range(1,12000):
  bulk.insert(TimeSeries.getDict(i))
bulk.execute()

问题是bulk.execute() 没有返回。是否存在某种性能问题或尺寸限制?

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    考虑将您的插入批量操作放入可管理的批次中,例如 500 个,因为写入命令可以接受不超过 1000 个操作(来自 docs),您将不得不将批量操作分成多个批次,在这种情况下,您可以选择最多 1000 个的任意批次大小。

    之所以选择 500,是为了保证 Bulk.insert() 的关联文档之和小于等于 maximum BSON document size,即使不保证使用默认的 1000 操作请求将符合 16MB BSON 限制。但是,mongo shell 中的 Bulk() 操作和驱动程序中的类似方法没有此限制。

    进行数学运算时,您需要确保这 500 个插入操作请求本身不会实际创建大于 16MB 的 BSON 文档,即对于具有 365 个值的输入文档,您需要确定将带来文件的总大小为 16MB 或更小。在我看来,与 365x12000 不同,365x500 似乎是小于 16MB 的合理猜测:

    bulk = db.test.initialize_unordered_bulk_op()
    counter = 0
    
    for i in range(1, 12000):
        # process in bulk
        bulk.insert(TimeSeries.getDict(i))
        counter += 1
    
        if (counter % 500 == 0):
            bulk.execute()
            bulk = db.test.initialize_unordered_bulk_op()
    
    if (counter % 500 != 0):
        bulk.execute()
    

    --更新--

    其实the limit does not apply do the bulk API反而是

    If a group exceeds this limit, MongoDB will divide the group into smaller groups of 1000 or less.

    感谢@Styvane 指出这一点。

    【讨论】:

    • 理论上它应该适用于批量写入操作中的所有方法。最好将更新批量化,这样您就可以管理批量操作,同时让服务器做最好的事情,即为您简化更新。
    • 是的,500 似乎是合理的,甚至 1000,只要您确定来自 bulk 方法的关联文档的总和小于或等于最大 BSON 文档大小。当您执行bulk.execute() 时,您应该能够在结果中看到写入响应,其中包含有关通过正常、错误等操作的数量的信息
    • 它可以安全地被移除,因为它除了清理队列中的剩余操作之外没有其他任何作用,例如如果 for 循环范围限制不是 500 的倍数,例如for i in range(1, 12400):那么前12000个操作会在for循环中处理,bulk会执行24次。现在剩余的 400 个操作将在循环外执行,因为 counter >= 12001 将满足 (counter % 500 != 0) 条件,因此最后 25 次批量执行将在该语句中。
    • 是的,应该没问题,因为您知道所有批量更新都在循环内完成 => 12000 % 500 = 0
    猜你喜欢
    • 2014-01-17
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多