我正在使用MongoDB/pymongo处理一个相当复杂的Django应用程序。在我的本地开发环境中,使用Django服务器,我获得了不错的性能。当我转到在Apache下运行的远程服务器时,存在占用大量时间的pymongo/BSON方法。在我的本地安装中,这些方法似乎根本没有被称为。我很难找到导致PyMongo行为发生这种变化的显著差异。
以下是从远程服务器的调用中选择的评测。同样,这些函数根本不会在本地调用。
ncalls tottime percall cumtime percall filename:lineno(function)
...
684 0.007 0.000 10.042 0.015 __init__.py:497(decode_all)
102704/735 1.193 0.000 10.035 0.014 __init__.py:325(_elements_to_dict)
546543/4233 2.549 0.000 10.025 0.002 __init__.py:314(_element_to_dict)
101969/1170 0.450 0.000 9.930 0.008 __init__.py:153(_get_object)
101448/1045 0.963 0.000 9.917 0.009 __init__.py:168(_get_array)
这可以通过使用C扩展编译PyMongo来解决。MacOS二进制文件附带了这些自动编译的扩展,如果不满足依赖关系,Linux安装将不会安装这些扩展。
详情在这里。
简而言之,安装依赖项:
关于Debian:
sudo apt-get install build-essential python-dev
在RedHat上:
sudo yum install gcc python-devel
然后用重新安装PyMongo
pip install --upgrade pymongo
并享受性能改进。