Python + MongoDB - 游标迭代太慢
我现在在做一个搜索引擎项目,使用的是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文档里的说明。