Pymongo 读取速度比 mongo 客户端(robomongo)慢得多

Posted

技术标签:

【中文标题】Pymongo 读取速度比 mongo 客户端(robomongo)慢得多【英文标题】:Pymongo read much slower than mongo client(robomongo) 【发布时间】:2018-06-12 22:15:06 【问题描述】:

在robomongo中查询非常快,下图显示我确实检索了500个文档:

我在result.type创建了索引,我的测试代码:

def get_test_data(limit):
    return collection.find('result.type':'detail')[:limit]

def test_one_read_multi_process():

    print('mongodb read')
    t = Timer()
    TASKS = list(get_test_data(500))
    print(t.elapsed_time, '\n')

pymongo 需要 21.716s ,太慢了。

在 mongodb 3.6、pymongo 最新版本、python 2&3 上测试

可能与 Pymongo significantly slower than mongo shell?

但我想要一个解决方案。

【问题讨论】:

【参考方案1】:

也许你可以安装 pymongo 并带有 c 扩展名,以检查你是否已经完成:

import pymongo
pymongo.has_c()

False 表示不是,True 表示是。

要安装带有 c 扩展名的 pymongo,您需要:

# Ubuntu or Debian
sudo apt-get install build-essential python-dev

# Red Hat based distributions
sudo yum install gcc python-devel

然后是pip install pymongo

有一些参考:

http://api.mongodb.com/python/current/installation.html#dependencies-for-installing-c-extensions-on-unix https://wicknicks.wordpress.com/2012/07/23/pymongo-and-performance/

【讨论】:

>>> pymongo.has_c() True ,已启用。【参考方案2】:

到目前为止,get_test_data 获取了集合中的所有文档并对结果进行切片。

您想对查询应用限制。

def get_test_data(limit):
    return collection.find('result.type':'detail', limit=limit)

【讨论】:

这等于切片。正如我所说,旧版本甚至不支持限制选项,只支持切片。 PS: pymongo 的 find 查询是可迭代的,所以 slice 没问题。这就是为什么我使用 list(xxx) 来转换它。 不,两者不相等。此答案适用于较新版本,但您使用的是 3.6。从生成的针对 Mongo 服务器执行的命令限制通过时应用于查询github.com/mongodb/mongo-python-driver/blob/3.6.0/pymongo/…

以上是关于Pymongo 读取速度比 mongo 客户端(robomongo)慢得多的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pymongo 中使用 mongo 函数?

pymongo 连接mongo数据库

pymongo模块

python操作pymongo

是否可以重命名 PyMongo 中 Mongo 查询输出中的字段?

Mongodb 命令及 pymongo 库的使用