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)慢得多的主要内容,如果未能解决你的问题,请参考以下文章