Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么使用pymongo的MongoDB中的查询速度会减慢?_Performance_Mongodb_Networking_Pymongo - Fatal编程技术网

Performance 为什么使用pymongo的MongoDB中的查询速度会减慢?

Performance 为什么使用pymongo的MongoDB中的查询速度会减慢?,performance,mongodb,networking,pymongo,Performance,Mongodb,Networking,Pymongo,我正在运行一个类似的查询374次,直到第367次,性能是合理的,但是返回结果的时间会大大缩短 我查询的集合存储帖子,其中每个帖子都有一个唯一的ID,并且数据库中将有同一帖子的多个版本。任务是获取每个帖子ID的最后版本。方法是获取帖子ID的不同列表,然后为每个帖子ID获取ObjectID最高的帖子ID 这也可以通过聚合框架完成,但它会出现错误,出现异常:聚合结果超过最大文档大小(16MB) 代码如下: for oi in obj_ids: #obj_ids is a list of strings

我正在运行一个类似的查询374次,直到第367次,性能是合理的,但是返回结果的时间会大大缩短

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

这也可以通过聚合框架完成,但它会出现错误,出现
异常:聚合结果超过最大文档大小(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,我发现似乎存在网络瓶颈

编辑:
拼写

似乎内存不足。在linux上,您可以通过
$free-m

看看你是否有空闲的内存。它增加延迟的因素似乎是您正在访问磁盘(交换操作)


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

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

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

交换是正确的。然而,如果它们是独立的查询,为什么mongo不清除它的缓存呢?嗯,mongo喜欢RAM。它缓存正在使用的页面。但我认为问题不在于mongo,而在于Python。原因是,当您在迭代中时,游标对象存在于内存中。相反,在处理游标的循环中有一个函数调用。我按照你的建议做了,但应用程序仍然以完全相同的方式减慢。对脚本进行分析表明,大部分时间都花在
\u socket.socket.recv
(请参阅随附的屏幕截图)上,因此瓶颈似乎是网络。您是否在每次迭代中都实例化一个新连接?我试着在每次迭代中实例化一个新连接,并保持一个连接处于活动状态。结果是一样的。