Python + MongoDB - 游标迭代太慢了

问题描述 投票:9回答:4

其实我正在做一个搜索引擎项目。我们使用的是python+mongoDb。我遇到了以下问题。

我有一个pymongo游标 在执行一个find()命令到mongo数据库后。pymongo游标有大约20k个结果。

我注意到在pymongo游标上的迭代速度比普通的迭代速度要慢,比如一个相同大小的列表。

我做了一个小基准。

-迭代一个20k字符串的列表: 0.001492秒 -迭代一个有20k结果的pymongo游标: 1. 445343秒 - 迭代一个有20k结果的pymongo游标:

差距真的很大。也许这个数量的结果不是问题,但如果我有上百万的结果,时间就无法接受了。

有谁知道为什么pymongo游标迭代速度太慢?有谁知道如何能在更短的时间内迭代游标?

一些额外的信息。

  • Python v2.6
  • PyMongo v1.9
  • MongoDB v1.6 32位
python performance mongodb cursor iteration
4个回答
11
投票

请记住pymongo驱动并不是一次给你返回所有20k结果。它是通过网络调用mongodb后台来获取更多的项目。当然,它不会像一个字符串列表那样快。 不过,我建议尝试调整游标的 batch_size 在api文档中概述的:


14
投票

您的pymongo安装是否使用了附带的 C语言扩展?

>>> import pymongo
>>> pymongo.has_c()
True

上周我花了大部分时间来调试一个中等规模的查询和相应的处理,花了20秒的时间来运行。 一旦安装了C扩展,整个同样的处理过程大概只需要一秒钟。

要在Debian中安装C扩展,在运行easy install之前安装python开发头文件。 在我的例子中,我还必须删除旧版本的pymongo。请注意,这将从C语言中编译一个二进制文件,所以你需要所有常用的工具。(GCC等)

# on ubuntu with pip
$ sudo pip uninstall pymongo
$ sudo apt-get install python-dev build-essential
$ sudo pip install pymongo

1
投票

默认的光标大小是4MB,最大可以达到16MB。你可以尝试增加你的光标大小,直到达到该限制,看看是否得到改善,但这也取决于你的网络可以处理。


-4
投票

对不起,但这是一个非常疯狂的说法,没有太多证据。你没有提供任何关于整体文档大小的信息。获取这样的文档量需要网络流量和数据库服务器上的IO。即使在 "热 "的状态下,使用温缓存,性能也是持续 "糟糕 "的?你可以使用 "mongosniff "来检查 "线 "的活动,也可以使用 "iostat "等系统工具来监控服务器上的磁盘活动。此外,"mongostat "还提供了一堆有价值的信息"。

© www.soinside.com 2019 - 2024. All rights reserved.