插入12k文档后,PyMongo Bulk不会返回

时间:2017-01-06 11:40:56

标签: mongodb pymongo

我在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()没有返回。是存在一种性能问题还是尺寸约束?

1 个答案:

答案 0 :(得分:2)

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

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

进行数学计算,您要确保这500个插入操作请求本身并不会实际创建大于16MB的BSON文档,即对于具有365个值的输入文档,您需要确定将使用的比例因子使文档的总大小为16MB或更少。对我来说,似乎365x500对于尺寸小于16MB是合理的猜测,与365x12000不同:

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

<强> - UPDATE -

实际上,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.

感谢@Styva ne指出这一点。