- 论坛徽章:
- 0
|
以前做项目的时候,主要是用hadoop来跑实验挖掘日志,线下再用awk来提取关键信息做图表来汇报,当时数据量比较少,直接用shell拼sql来记录,一天记录的最终结果比较少,没怎么想过效率。直到某天需求急剧上升,一天需要存储千万级别的行的时候才发现速度上的悲剧。请教了同事以后,发现同事用的python模块来批量操作。自己拷过来测了一下速度,顿时就湿了,速度比我的快了不止100倍...shell是每操作一行都重建下连接,用python写的时候先开链接,再批量操作,最后关闭流。效率不言而喻。
后来开发测试的时候发现了mysql的一些配置上的失误,mysql里面数据量很大的话,安装的时候一定要注意,默认安装会安装在/usr/bin/mysql下面,这个当时自己发现是在交换分区的,而且数据文件也是放在交换分区的,一天导入4000W的行基本上有6G左右,线下测试的第二天才发现这个问题。还有,表和表相互做笛卡尔乘积的时候是需要交换空间的,以前也出现过应为交换区空间太小sql报错的情况,这个时候在/home下面新建个tmp,再把交换空间里面的tmp软链接过去就OK了
后来项目上线,在同事的帮助下给OP写了一份可以一次性安装好mysql以及配置以及python的MySQLdb库的脚本,今天在自己的ubuntu11.10下面用这个安装的时候发现一直报错,昨晚弄了一个晚上,想了想估计是redhat和ubuntu不同导致的。于是今天上午重新弄了下:
1 如果因为不会安装mysql导致登陆不上mysql或者因为XXlock之类的错误的话,可以先用ps -aux | grep "mysql"看看有没有已安装的版本,把服务先停了。在按照:
sudo apt-get autoremove --purge mysql-server-5.0
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common (非常重要)
来卸载
2 安装mysql。最简洁的方法就是 sudo apt-get install mysql-server。安装的过程中会要求配置root账号和密码。这么安装后mysql就基本上可以用了,但是在/usr/bin/下面会缺少mysql_config文件,后面安装MySQLdb的时候会报错找不到文件。再安装两个包就行了:sudo apt-get install mysql-client 和sudo apt-get install libmysqlclient-dev。
3 下载对应的setuptools-0.6c11-py2.7.egg。ubuntu11.10里面默认安装的python是2.7的,所以要下载对应2.7版本的http://pypi.python.org/packages/ ... ls-0.6c11-py2.7.egg。下载后chmod +x 添加可执行权限再sudo ./setuptools-0.6c11-py2.7.egg执行下。
4 我自己安装的MySQLdb是MySQL-python-1.2.3版本的,这个网上很多下载。解压后首先修改site.cfg文件
embedded = False
threadsafe = False
static = False
mysql_config = /usr/bin/mysql_config
这么修改就OK了。
5 在文件夹下面执行sudo python setup.py build和sudo python setup.py install。这个时候可能会报错,出现pymemcompat.h:10: fatal error: Python.h: 没有那个文件或目录。这个时候只需要sudo apt-get install python-dev安装下环境就OK了,在重复5
6 测试。直接python命令进去import MySQLdb看报错与否,不报错就是正常了。附一点测试代码:
import os, sys, string
import MySQLdb
# 连接数据库
try:
conn = MySQLdb.connect(host='localhost',user='root',passwd='xxxx',db='test1')
except Exception, e:
print e
sys.exit()
# 获取cursor对象来进行操作
cursor = conn.cursor()
# 创建表
sql = "create table if not exists test1(name varchar(12 primary key, age int(4))"
cursor.execute(sql)
# 插入数据
sql = "insert into test1(name, age) values ('%s', %d)" % ("zhaowei", 23)
try:
cursor.execute(sql)
except Exception, e:
print e
sql = "insert into test1(name, age) values ('%s', %d)" % ("张三", 21)
try:
cursor.execute(sql)
except Exception, e:
print e
# 插入多条
sql = "insert into test1(name, age) values (%s, %s)"
val = (("李四", 24), ("王五", 25), ("洪六", 26))
try:
cursor.executemany(sql, val)
except Exception, e:
print e
#查询出数据
sql = "select * from test1"
cursor.execute(sql)
alldata = cursor.fetchall()
# 如果有数据返回,就循环输出, alldata是有个二维的列表
if alldata:
for rec in alldata:
print rec[0], rec[1]
cursor.close()
conn.close() |
|