Python + MongoDB - 游标迭代太慢

10 投票
3 回答
16027 浏览
提问于 2025-04-16 14:41

我现在在做一个搜索引擎项目,使用的是Python和MongoDB。

我在执行了一个find()命令后得到了一个pymongo游标,这个游标里大约有2万条结果。

我发现,遍历这个pymongo游标的速度比遍历一个同样大小的列表要慢很多。

我做了一个小测试:

  • 遍历一个包含2万条字符串的列表:0.001492秒
  • 遍历一个包含2万条结果的pymongo游标:1.445343秒

这个差距真的很大。虽然对于这个数量的结果来说可能还好,但如果结果有几百万条,那时间就太长了,根本无法接受。

有没有人知道为什么pymongo游标的遍历速度这么慢?有没有什么办法可以更快地遍历这个游标呢?

一些额外信息:

  • Python版本:2.6
  • PyMongo版本:1.9
  • MongoDB版本:1.6 32位

3 个回答

1

默认的光标大小是4MB,最大可以达到16MB。你可以尝试把光标大小调大,直到达到这个上限,看看是否有改善。不过,这也要看你的网络能承受多大的负荷。

16

你的pymongo安装是不是在用里面的C扩展呢?

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

我上周花了大部分时间在调试一个中等复杂的查询和相应的处理,这个过程花了20秒钟。安装了C扩展后,同样的过程大约只用了1秒钟。

在Debian上安装C扩展时,先要安装python开发头文件,然后再运行easy install。在我的情况下,我还需要先卸载旧版本的pymongo。要注意,这个过程会从C语言编译出一个二进制文件,所以你需要准备好所有常用的工具(比如GCC等)。

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

记住,pymongo这个工具不会一次性把所有2万条结果都给你。它会在你逐步查看结果的时候,向mongodb后台请求更多的数据。这样做的速度自然比直接拿到一个字符串列表要慢。不过,我建议你可以试着调整一下游标的批量大小,具体可以参考API文档里的说明。

撰写回答