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