0

我目前有一个长时间运行的操作(在 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()需要很长时间——基本上与实际执行分析一样长!有一个更好的方法吗?

4

1 回答 1

1

skip()在这种情况下可能会很慢。您可以通过使用最后_id一批来查询下一批来进行范围查询。像这样的东西:

db.<collection>.find({ "_id" : { $gte: prev_batch_last_id } } ).sort( { _id : 1 } ).limit(limit);

您必须自己将批次的最后一个 id 存储到一个变量中。

于 2012-05-31T23:11:38.633 回答