我目前有一个长时间运行的操作(在 Python+Celery 中运行),它遍历大约 43,000,000 个元素的整个 Mongo 集合,并对元素进行分析而不对这些元素进行任何更改。
随着这个集合的增长,操作开始需要更长的时间(显然),现在通常由于不同数据库的超时而定期失败。
我想将此操作拆分为几个较小的操作(可能仅对几百万个元素进行操作),并且我想知道生成将执行拆分的查询的最佳方法。我在这个集合上只有一个索引,它的_id
.
显而易见的答案似乎是这样的:
# This is executed in parallel on different servers
def doAnalysis(skipped,limit)
db.<collection>.find().skip(skipped).limit(limit)
...
# This is the parent task
elemsToAnalyze = db.<collection>.find().count()/10;
for i in range(0,10:
doAnalysis(elemsToAnalyze * i, elemsToAnalyze)
但事实证明这.skip()
需要很长时间——基本上与实际执行分析一样长!有一个更好的方法吗?