compare mongo 3.0.0 rc7 & PostgreSQL 9.3.5 insert use python

测试机用的CentOS 6.6 x64 96G内存, 8核, 数据文件放在 OCZ SSD

下载mongo 3.0

# tar -zxvf mongodb-linux-x86_64-3.0.0-rc7.gz
# cd mongodb-linux-x86_64-3.0.0-rc7
# cd bin/

创建数据文件目录

# mkdir -p /data01/mongodb

启动数据库, 参数全部在命令行中

# ./mongod --port 5281 --bind_ip 0.0.0.0 --maxConns 10000 --logpath /tmp/mongo.log --logappend --logRotate reopen --pidfilepath /tmp/mongo.pid --noauth --dbpath /data01/mongodb --fork

2015-02-04T23:23:42.438+0800 I CONTROL  ***** SERVER RESTARTED *****
2015-02-04T23:23:42.470+0800 I CONTROL  [initandlisten] MongoDB starting : pid=627122 port=5281 dbpath=/data01/mongodb 64-bit host=localhost.localdomain
2015-02-04T23:23:42.470+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-02-04T23:23:42.470+0800 I CONTROL  [initandlisten]
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] db version v3.0.0-rc7
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] git version: e4c60053b2967e16f765fa25d16aa6d629faa196
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] build info: Linux build14.nj1.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] allocator: tcmalloc
2015-02-04T23:23:42.471+0800 I CONTROL  [initandlisten] options: { net: { bindIp: "0.0.0.0", maxIncomingConnections: 10000, port: 5281 }, processManagement: { fork: true, pidFilePath: "/tmp/mongo.pid" }, security: { authorization: "disabled" }, storage: { dbPath: "/data01/mongodb" }, systemLog: { destination: "file", logAppend: true, logRotate: "reopen", path: "/tmp/mongo.log" } }
2015-02-04T23:23:42.483+0800 I JOURNAL  [initandlisten] journal dir=/data01/mongodb/journal
2015-02-04T23:23:42.483+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
2015-02-04T23:23:42.586+0800 I JOURNAL  [durability] Durability thread started
2015-02-04T23:23:42.587+0800 I JOURNAL  [journal writer] Journal writer thread started
2015-02-04T23:23:42.594+0800 I NETWORK  [initandlisten] waiting for connections on port 5281

下载,安装 pymongo驱动

https://pypi.python.org/pypi/pymongo/

# wget https://pypi.python.org/packages/source/p/pymongo/pymongo-2.8.tar.gz#md5=23100361c9af1904eb2d7722f2658114
# tar -zxvf pymongo-2.8.tar.gz
# cd pymongo-2.8
# python setup.py install

退出pymongo的源码目录

测试

# cd
[root@localhost ~]# python
Python 3.4.2 (default, Jan 27 2015, 00:11:11)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
# 因为我们这里使用的是单节点mongo, 所以使用MongoClient链接即可, 如果用到了master-slave或replica, 最好使用对应的链接接口.
>>> c=pymongo.MongoClient(host='127.0.0.1',port=5281,max_pool_size=1000)
# 创建或连接到一个数据库
>>> db = c.test_database
# 创建或使用一个已有的collection
>>> collection = db.test_collection
# 生成条dict记录
>>> row={'id':1, 'username': 'digoal.zhou', 'age':32, 'email':'digoal@126.com', 'qq':'276732431'}
>>> row
{'age': 32, 'qq': '276732431', 'email': 'digoal@126.com', 'id': 1, 'username': 'digoal.zhou'}
>>> type(row)
<class 'dict'>
# 插入到collection
>>> collection.insert(row)
ObjectId('54d22c8de138238e62bcd73f')
>>> collection
Collection(Database(MongoClient('127.0.0.1', 5281), 'test_database'), 'test_collection')
# 注意再次插入为什么失败呢?
# 原因是insert后row被变更了, 自动添加一个_id, 即mongodb 中唯一标识一个document的值, 必须唯一.
>>> r1=collection.insert(row)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/site-packages/pymongo-2.8-py3.4-linux-x86_64.egg/pymongo/collection.py", line 410, in insert
    _check_write_command_response(results)
  File "/usr/local/lib/python3.4/site-packages/pymongo-2.8-py3.4-linux-x86_64.egg/pymongo/helpers.py", line 202, in _check_write_command_response
    raise DuplicateKeyError(error.get("errmsg"), 11000, error)
pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: test_database.test_collection.$_id_ dup key: { : ObjectId('54d22c8de138238e62bcd73f') }
>>> print(row)
{'age': 32, 'qq': '276732431', 'email': 'digoal@126.com', '_id': ObjectId('54d22d37e138238e62bcd740'), 'id': 1, 'username': 'digoal.zhou'}

测试mongodb插入性能

# vi test.py
import pymongo
import time

# 使用unix socket连接
c=pymongo.MongoClient('/tmp/mongodb-5281.sock')
# c=pymongo.MongoClient(host='127.0.0.1',port=5281,max_pool_size=1000)
db = c.test_database
db.drop_collection('test_collection')
collection = db.test_collection
print(time.time())
print(collection.count())
for i in range(0,1000000):
  collection.insert({'id':1, 'username': 'digoal.zhou', 'age':32, 'email':'digoal@126.com', 'qq':'276732431'})
print(time.time())
print(collection.count())

测试结果 : 

100万条记录, 单线程插入耗时378秒.

# python ./test.py
1423061694.137046
0
1423062072.2314758
1000000

对比测试同一台主机的postgresql插入性能 : 

$ vi test.py
import postgresql
import time

# 使用unix socket连接
conn = { "user": "postgres",
         "database": "postgres",
         "unix": "/data01/pgdata/pg_root/.s.PGSQL.1921"
}

db = postgresql.open(**conn)
db.execute("drop table if exists tt")
db.execute("create table tt(id int, username name, age int2, email text, qq text)")
ins = db.prepare("insert into tt values($1,$2,$3,$4,$5)")
print(time.time())
print(db.query("select count(1) as a from tt"))
for i in range(0,1000000):
  ins(1,'digoal.zhou',32,'digoal@126.com','276732431')
print(time.time())
print(db.query("select count(1) as a from tt"))

测试结果 :

100万条记录, 单线程插入耗时187秒.

$ python test.py
1423062311.1081557
[(0,)]
1423062498.4938233
[(1000000,)]

测试结果仅供参考.

[参考]

1. http://api.mongodb.org/python/current/api/pymongo/index.html

2. http://blog.163.com/digoal@126/blog/static/16387704020151210840303/

时间: 2024-08-01 16:16:43

compare mongo 3.0.0 rc7 & PostgreSQL 9.3.5 insert use python的相关文章

Sequelize 4.0.0(final) 发布,Node.js 的 ORM

Sequelize 4.0.0 发布了,Sequelize.js 提供对 MySQL,MariaDB,SQLite 和PostgreSQL 数据库的简单访问,通过映射数据库条目到对象,或者对象到数据库条目.简而言之,就是 ORM(Object-Relational-Mapper).Sequelize.js 完全是使用 JavaScript 编写,适用于 Node.js 的环境. v4 版本包含大量 bug 修复和更新,部分内容如下: [ADDED] Add isSoftDeleted helpe

连接 0.0.0.0/32 发生了什么

根据RFC 3330, 1700 的描述, 0.0.0.0/32 可以用作当前网络的源地址. 0.0.0.0/8 - Addresses in this block refer to source hosts on "this" network. Address 0.0.0.0/32 may be used as a source address for this host on this network; other addresses within 0.0.0.0/8 may be

mongoDB 2.0.0 shard implemention with noauth=true

配置和1.8差不多,只是mongoDB2.0.0本身带来了一些新的特性,所以参数配置有点不一样.以下是详细部署过程 :  产品部署注意事项 :  do not use hugepage use ntp use ext4/xfs mount with option : noatime  Do not use NUMA DELL服务器关闭NUMA : Node Interleaving 改为Enabled则安装对称内存配置时支持内存交错.如果为 Disabled(已禁用),系统支持非一体化内存体系结

Pomm 1.0.0发布 PHP对象模型管理工具

Pomm 是一个轻量级.快速.高效和强大的PHP对象模型管理工具,用于PostgreSQLhttp://www.aliyun.com/zixun/aggregation/22.html">关系数据库.Pomm与PostgreSQL生成代码,具有快度和其丰富的功能设置从中受益.它使用SQL作为查询语言,使它更容易直接优化查询,这使得开发人员可以使用用户定义的类型,命名空间,数组,关键值存储,表继承,窗口功能,加密,存储过程,触发器,和所有其他功能由PostgreSQL提供.Pomm提供了纯P

MongoDB 启动 Failed to connect to 127.0.0.1:27017, reason: 由于目标计算机积极拒绝,无法连接。

        在学习MongoDB的过程中,遇到一个很郁闷的问题:如下--无法连接到127.0.0.1服务器                      一开始我查资料,各路大神都说是没有启动mongoDB,可是我明明是启动了的,其实原因是我没有等待,mongo确实没有启动, 需要等待一会儿,连同的结果是这样的:                      接下来我们就可以在上面操作了!          

Andorid 关于PTRACE ptrace(PTRACE_TRACEME,0 ,0 ,0);

通过对App进行加固保护,梆梆可以有效防止移动应用在运营推广过程中被破解.盗版.二次打包.注入.反编译等破坏,保障程序的安全性.稳定性,对移动应用的整体逻辑结构进行保护,保证了移动应用的用户体验. 一.梆梆加固逆向分析过程 首先我们通过对APK加固前后文件结构的比较,来了解梆梆加固对APK文件所做的处理.为了使分析过程足够简单,我新建一个最简单的测试程序,并上传到梆梆加固,整个加固过程大概需要4天的时间才可以完成,这是一个漫长的等待过程. 该测试程序包含了Activity.Service.Con

为什么有时PHP程序会在开头显示:X-Powered-By: PHP/4.0.0之类的字符呢?

程序|显示 这是因为PHP.INI中有一些设置不对,最有可能是就是有无效的DLL文件在内.但为什么会出现这些呢?我在WIN32下,建了一个空的test.php文件.然后执行c:\php4\php.exe test.php,此时我的php.ini的配置是正确的.屏幕输出为:X-Powered-By: PHP/4.0.0Content-type: text/html咦,这不是显示在屏幕上的东西吗?是的.但这时这两行是作HTTP信息头的.是不会显示在浏览器中的. 现在我在php.ini中加载了php_

AJAX/XUL Web框架ZK 1.0.0 Final 发布

ajax|web AJAX框架ZK近日宣布,ZK 1.0.0 Final 正式发布. ZK 是一个基于XUL嵌入AJAX事件驱动的Java 框架,用于丰富用户网络应用程序界面.利用该工具,你可以设置你的网络应用程序包含功能丰富的XUL与HTML组件,并且通过监听用户触发事件来轻松的操作这些组件,最大的好处是,可以在服务期端轻松简便的操作就像操作桌面程序一样.ZK是基于GPL发布的. 该新版本中包括,拖放功能,增加了getUserPrincipal用于指定page ID,等等. http://so

PHP 4.0.0中session.save

session PHP 4.0.0中session.save_path的bug 作者/ 这里向大家汇报我发现的一个4.0.0版的一个bug,只限于windows版本.那就是:在4.0.0版下,session.save_path如果使用绝对目录,即加上盘符的话,盘符不起作用.如session.save_path设为c: emp,此时存在c: emp目录.但是当php程序文件在其它盘上时,如在f盘上,c:不起作用.而是在处理session时寻找f盘上的 emp目录.如果f盘上无 emp目录,则会报如