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

Mongodb 插入12k文档后,PyMongo Bulk不会返回,mongodb,pymongo,Mongodb,Pymongo,我在macOS上使用Pymongo3.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()不会返回。是否存在某种性能问题或尺寸限制 考虑将插入批量操作放入可管理的

我在macOS上使用Pymongo3.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()
不会返回。是否存在某种性能问题或尺寸限制

考虑将插入批量操作放入可管理的批中,例如500个,因为写入命令最多只能接受1000个操作(从),因此必须将批量操作拆分为多个批,在这种情况下,您可以选择最大为1000的任意批大小

选择500的原因是为了确保来自的关联文档的总和小于或等于,即使无法保证使用默认
1000
操作请求将符合16MB BSON限制。但是,mongo shell中的操作和驱动程序中的类似方法没有此限制

进行计算时,您需要确保这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()

--更新--

实际上,但是


感谢ne指出这一点。

理论上,它应该适用于批量写入操作中的所有方法。最好是批量更新,这样你可以管理批量操作,同时让服务器做最好的事情,即为你简化更新。是的,500似乎是合理的,甚至1000,只要你确定批量方法的相关文档的总和小于或等于最大BSON文档大小。执行
bulk.execute()
时,您应该能够在结果中看到写响应,其中包含有关通过ok的操作数的信息,错误etcIt可以安全地删除,因为它除了清理队列中的剩余操作外,不做任何其他事情。例如,如果for循环范围限制不是500的倍数,例如范围(112400)中i的
:那么前12000个操作将在for循环中处理,大容量将执行24次。现在剩余的400操作将在循环外执行,因为
计数器>=12001
将满足
(计数器%500!=0)
条件,因此最后25次批量执行将在该语句中。是,应该没问题,因为您知道所有批量更新都是在循环中完成的=>
12000%500=0
Hi@chridam又是我:)