10

我实际上在一个搜索引擎项目中工作。我们正在使用 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

4 回答 4

15

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

>>> 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
于 2012-01-23T18:34:35.917 回答
12

请记住,pymongo 驱动程序不会一次将所有 20k 结果返回给您。当您迭代时,它正在对 mongodb 后端进行网络调用以获取更多项目。当然它不会像字符串列表那么快。但是,我建议尝试按照 api 文档中的说明调整光标 batch_size :

于 2011-03-30T00:13:16.513 回答
1

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

于 2011-10-19T22:17:42.313 回答
-3

您没有提供有关整体文档大小的任何信息。获取如此数量的文档需要数据库服务器上的网络流量和 IO。

即使在具有热缓存的“热”状态下,性能也保持“差”?您可以使用“mongosniff”来检查“wire”活动,并使用“iostat”等系统工具来监控服务器上的磁盘活动。此外“mongostat”提供了一堆有价值的信息”。

于 2011-03-30T00:24:45.687 回答