Python + MongoDB - 游标迭代太慢了

时间:2011-03-29 23:52:26

标签: python performance mongodb cursor iteration

我实际上在搜索引擎项目中工作 我们正在使用python + mongoDb 我遇到以下问题:

在对mongo db执行find()命令后,我有一个pymongo游标 pymongo游标有大约20k的结果。

我注意到,与正常迭代相比,pymongo游标上的迭代非常慢,例如相同大小的列表。

我做了一点基准测试:

- 对20k字符串列表的反应:0.001492秒
- 一个pymongo光标的结果,有20k结果:1.445343秒

差异真的很大。这个数量的结果可能不是问题,但如果我有数百万的结果,时间将是不可接受的。

有没有人知道为什么pymongo游标迭代太慢? 我知道如何在更短的时间内迭代光标?

一些额外信息:

  • Python v2.6
  • PyMongo v1.9
  • MongoDB v1.6 32位

4 个答案:

答案 0 :(得分:14)

您的pymongo安装是否使用包含的C extensions

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

我上周大部分时间都在尝试调试中等大小的查询以及需要20秒才能运行的相应处理。安装C扩展后,整个过程大约需要一秒钟。

要在Debian中安装C扩展,请在运行easy install之前安装python开发头文件。在我的情况下,我还必须删除旧版本的pymongo。请注意,这将从C编译二进制文件,因此您需要所有常用工具。 (海湾合作委员会等)

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

答案 1 :(得分:11)

请记住,pymongo驱动程序不会一次性返回所有20k结果。当您迭代时,它正在对mongodb后端进行网络调用以获取更多项目。当然它不会像字符串列表一样快。但是,我建议您尝试调整游标batch_size as outlined in the api docs

答案 2 :(得分:1)

默认光标大小为4MB,最大可达16MB。您可以尝试增加光标大小,直到达到该限制并查看是否有改进,但这也取决于您的网络可以处理的内容。

答案 3 :(得分:-2)

抱歉,这是一个非常疯狂的主张,没有太多证据。您不提供有关整体文档大小的任何信息。获取如此大量的文档需要数据库服务器上的网络流量和IO。即使在温暖缓存的“热”状态下,性能也会持续“糟糕”?您可以使用“mongosniff”来检查“wire”活动和系统工具(如“iostat”)以监视服务器上的磁盘活动。此外,“mongostat”提供了一堆有价值的信息“。