0

我正在运行类似的查询 374 次,直到第 367 次性能是合理的,但是返回结果的时间会急剧下降。

我查询的集合存储帖子,其中每个帖子都有一个唯一的 ID,并且数据库中将有同一个帖子的多个版本。任务是获取每个帖子 ID 的最新版本。该方法是获取不同的帖子 ID 列表,然后为每个帖子 ID 获取具有最高 ObjectID 的帖子 ID。

这也可以通过聚合框架来完成,但它会出错exception: aggregation result exceeds maximum document size (16MB)

这是代码:

for oi in obj_ids: #obj_ids is a list of strings containing unique post IDs
    t1 = time.time()
    o = col.find({'object_id':oi}).sort('_id', -1).limit(1)[0]
    t2 = time.time()

col.find函数是定时的,下面是这个查询的性能如何随着时间的推移而恶化:

364 of 374 in 0.00369000434875s
365 of 374 in 0.0037579536438s
366 of 374 in 0.00375485420227s
367 of 374 in 0.00367307662964s
368 of 374 in 0.735110998154s
369 of 374 in 3.09494900703s
370 of 374 in 5.16561698914s
371 of 374 in 7.14517307281s
372 of 374 in 8.3472340107s
373 of 374 in 8.61702394485s
374 of 374 in 8.07462406158s

任何想法发生了什么?

更新 2012/11/01

使用 Python cprofile 我发现似乎存在网络瓶颈

按时间排序

编辑:拼写

4

3 回答 3

1

好像你的内存可能用完了。在 linux 上,您可以通过以下方式检查 RAM$ free -m

查看您是否有可用的 RAM。它增加延迟的因素似乎是您正在访问磁盘(交换操作)。

如果 python 占用内存,请使用gc模块。

于 2013-01-10T16:03:38.200 回答
0

问题与指数有关。我在 _id 和 object_id 上创建了一个复合索引,而实际上我应该添加一个单独的 _id 索引和 object_id 索引。完成此操作后,约 380 个查询在大约 10 秒内运行,而不是 5 分钟。

于 2013-01-14T15:54:46.390 回答
0

如果您想使用聚合框架,并且出现“聚合结果超出最大文档大小 (16MB)”错误,您可以使用 $out 语句将结果放在临时集合中,然后从该集合中查看结果收藏。如果您的集合中有大量元素,这可能会更快,因为您最终会减少查询,从而减少网络延迟。

于 2014-07-27T12:22:22.943 回答