比之前脚本添加了,测试公网IP的函数。
def get_global_ip():
get_html = urllib2.urlopen(‘http://iframe.ip138.com/ic.asp’).read()
_re_ip = re.compile(r’\d{2,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}’, re.DOTALL)
_global_ip = _re_ip.findall(get_html)[0]
return _global_ip
Tag Archives: py
python 连接hbase存、取图片
连接hbase1.0.4需要使用Thrift,我用的是python2.6。
安装thrift。下载地址https://dist.apache.org/repos/dist/release/thrift/0.9.0/thrift-0.9.0.tar.gz解压后安装命令。
在hbase服务器上,确保hbase服务已经启动。在thrift目录中,用管理员运行一下命令安装。
./configure
make
make install
安装完毕生成hbase的client代码命令格式如下,
thrift –gen
登陆到hbase的权限进入
$ cd hbase/src/main/resources/org/apache/hadoop/hbase/thrift
生成python的
$ thrift –gen py Hbase.thrift
再生成一个C的学习备用,与本文无关
$ thrift –gen c_glib Hbase.thrift
将gen-py文件夹下的hbase文件夹拷贝到要连接hbase的服务器的python目录下,我用的是python2.6,自己手动安装的。命令如下
cp -R hbase /usr/local/lib/python2.6/site-packages/
拷贝完毕用import导入 hbase成功。开始写代码了。参考hbase里的例子在hbase/src/examples/中。
我的任务就是把某个目录下,以jpg结尾的图片放到hbase里,因为图片名没有重复,所以用图片名做row name。hbase手动建表’hbase(main):013:0> create ‘img’, ‘data:”。
首先统计一下照片的数量。这个image目录下只有jpg的图片,使用匹配只是备将来使用。下面只是测试脚本,不关心业务逻辑。
# find /image/ -name \*.jpg -type f |wc -l
13140
# du -s -h /image
303M /image/
本地共有13140张照片共303M,写入hbase测试脚本如下:
#!/bin/bash # ------------------------------- # Revision: # Date: 2012-12-11 # Author: simonzhang # Email: simon-zzm@163.com # Web: www.simonzhang.net # ------------------------------- import os import re from thrift.transport import TSocket from thrift.transport import TTransport from thrift.protocol import TBinaryProtocol from hbase import Hbase from hbase.ttypes import * #### base set find_path=(r'/image/', ) class HbaseWrite(): def __init__(self): self.tableName = 'img' self.transport = TSocket.TSocket('192.168.100.100', 9090) self.transport = TTransport.TBufferedTransport(self.transport) self.transport.open() self.protocol = TBinaryProtocol.TBinaryProtocol(self.transport) self.client = Hbase.Client(self.protocol) def createTable(self, tableName): col1 = ColumnDescriptor(name="data:",maxVersions=1) self.client.createTable(tableName,[col1]) def write(self, PicPath, PicName): row = PicName.split('.')[0] _data = PicName.split('.')[1] PicData = open('%s/%s' % (PicPath, PicName), 'rb').read() # 此处需要注意格式,网上的格式报错,少个参数报错如下 # TypeError: mutateRow() takes exactly 5 arguments (4 given) self.client.mutateRow(self.tableName, row, [Mutation(column="data:%s" % _data, value=PicData)], {}) def read(self, tableName, PicName): row = PicName.split('.')[0] data_type = PicName.split('.')[1] get_data = self.client.get(tableName, row, 'data:%s' % data_type, {})[0] if get_data: return get_data.value else: return "Error" def main(_path): WHB = HbaseWrite() WHB.createTable() find_file=re.compile(r"^[0-9a-z]*.jpg$") find_walk=os.walk(_path) for path,dirs,files in find_walk: for f in files: if find_file.search(f): path_name=path file_name=f WHB.write(path_name, file_name) if __name__ == "__main__": for get_path in find_path: main(get_path)
开始测试脚本
# time python hbase_test.py
real 1m15.471s
user 0m4.881s
sys 0m2.867s
到hbase里查看写入的数量,证明已经完全写入。
hbase(main):001:0> count ‘img’
:
:
:
13140 row(s) in 10.2780 seconds
2013-5-16. 因为对hadoop理解不足。以下写的有问题,提醒大家注意。
hbase使用hadoop进行存储,查看hadoop的磁盘使用量。
26K namenode1/
298M u01/
我的内存给namenode可以使用25G。根据以上数据计算结果如下:
((25*1000*1000)/26)*298= 286538461M = 286538G = 286 T
如果每台服务器有三块1T存储硬盘,此集群可以有95台服务器。共存储此类照片大约为12634615360张。内网测试,写入速度3.9M。
注:有一点需要注意,写入的数据删除后磁盘空间也不会释放,原理应该改和mongodb一样,但是没有仔细查看。
python 通过邮件服务器发送 邮件
很早写的,本来觉得意义不大,还是放上来,以备丢了。python2.6下发送通过。
#!/bin/env python # -*- coding:utf-8 -*- # ------------------------------------------------------------------------------- # Filename: sendmail.py # Revision: 1.0 # Date: 2012-7-18 # Author: simonzhang # Email: simon-zzm@163.com # Web: www.simonzhang.net # ------------------------------------------------------------------------------- import smtplib from email.mime.text import MIMEText # mail_host = 'smtp.exmail.qq.com' mail_user = 'XXXXXXXX' mail_pwd = 'XXXXXXXXX' def mail_send(content, mailto, get_sub): msg = MIMEText(content.encode('utf8'), _subtype='html', _charset='utf8') msg['From'] = mail_user msg['Subject'] = u'%s' % get_sub msg['To'] = mailto try: s = smtplib.SMTP() s.connect(mail_host) s.login(mail_user,mail_pwd) s.sendmail(mail_user,[mailto],msg.as_string()) s.close() except Exception ,e: print e
如果我做双色球报表系统性能会如何
双色球有人中了5.7亿,各种怀疑的声音也此起彼伏。有人说停售到开奖直播中间有一段时间是在算出现概率。我对是否在算并不感兴趣,我倒是想知道,如果在算要用什么样子的服务器
,会有多大压力。实际值2012072期销售349310588元,共174655294注。我用一台很老的dell 2850 来试验,双核3.2主频的单cpu,4G内存,ide接口硬盘。 Centos 5.4 64位系统,mysql5。
写个脚本产生随机数来模拟彩票投注。根据投注号产生MD5码,取MD5的前两位作为分表依据。
需要速度,所以开始用C来作,因学艺不精,C写的东西速度很慢,并且也没有找到原因,我将c的代码放在最后,如有朋友能帮忙解决烦请告知。最后还是用python来做。通过初步试验,
产生100万数据并入库需要3分多钟,如果产生1.8亿需要12个多小时。最后决定只产生一张表的数据,一张表数据100万。取MD5前两位,如果每张表都是100万,总共能产生2.56亿注,这个值
可以满足测试要求。
产生表的SQL如下:
CREATE TABLE `dt_00` ( \ `Id` int(11) NOT NULL AUTO_INCREMENT, \ `CreateUnixTime` varchar(13) NOT NULL, \ `RedBlue` varchar(21) DEFAULT NULL, \ `HashValues` varchar(32) DEFAULT NULL, \ `SaleId` int(11) DEFAULT NULL, \ PRIMARY KEY (`Id`), \ KEY `i_RedBlue` (`RedBlue`), \ KEY `i_HashValues` (`HashValues`) \ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
产生投注的脚本如下,因为开始考虑到要放到256张表里,所以就没有做成批量入库,而是做成生成SQL语句,5000条提交一次。:
#!/bin/env python # ---------------------------------------- # Filename: rand.py # Revision: 1.0 # Date: 2012-06-24 # Web: http://www.simonzhang.net # Author: simonzhang # Email: simon-zzm@163.com # ---------------------------------------- import random import time import MySQLdb import hashlib def mysql_run(sql): try: db = MySQLdb.connect(host = '192.168.1.41', user = 'double', passwd = 'ball', db = 'doubleball') cursor = db.cursor() except MySQLdb.Error, e: print "Error %d:%s" % (e.args[0], e.args[1]) exit(1) try: result_set = '' cursor.execute('%s' % sql) result_set = cursor.fetchall() cursor.close() db.close() return result_set except MySQLdb.Error, e: print "Error %d:%s" % (e.args[0], e.args[1]) cursor.close() db.close() def create_sql(): z = 0 _tmp_di = [] while (z < 6): red = random.randint(1, 33) count_rand_di = 0 if len(_tmp_di) > 0: for i in _tmp_di: if red == i: count_rand_di += 1 if count_rand_di == 0: _tmp_di.append(red) z += 1 _tmp_di.sort() blue = random.randint(1, 16) _result_di = '' for j in xrange(6): if j == 1: _result_di = "%s" % _tmp_di[j] else: _result_di += " %s" % _tmp_di[j] _get_md5 = hashlib.md5("%s+%s" % (_result_di, blue)).hexdigest() if _get_md5[0:2] == "00": _create_sql = "INSERT INTO dt_00(CreateUnixTime,RedBlue,HashValues) VALUES (\'%s\',\'%s+%s\',\'%s\');" % (int(time.time()), _result_di, blue, _get_md5) else: _create_sql = "" return _create_sql def write_time(): _open_file = open("history.txt", "ab") get_time = time.localtime() _open_file.write("%s-%s-%s %s:%s:%s\n" % (get_time[0], get_time[1], get_time[2], get_time[3], get_time[4], get_time[5])) _open_file.close() def main(): _get_sql = '' for i in xrange(1000000): _loop_status = 0 while _loop_status == 0: _tmp_sql = create_sql() if len(_tmp_sql) >2: _loop_status = 1 _get_sql += _tmp_sql if i % 5000 == 0: print i mysql_run("%scommit;" % _get_sql) _get_sql = '' if __name__ == "__main__": write_time() main() write_time()
运行完毕使用sql分组统计,查看分组和排序结果SQL如下,运行一次用时6.693秒。
SELECT count(*) AS c, RedBlue, HashValues FROM dt_00 d GROUP BY d.HashValues ORDER BY c DESC
结论:因为要保证速度和稳定,所以购买系统应该是各省有各省的一套系统,然后准实时向中心汇数据,所以汇总需要的时间基本可以忽略。统计是按照分表的方式进行计算,然后在合
并结果,从计算效率来看,如果使用Dell R420高配的服务器,即使只有一台,系统也可以在3-5分钟产生出所有的分析报表(这个是估算,因为不知道需要多少统计表,也不知道需要统计的
逻辑)。如果是用oracle数据库应该会更安全快速。
我写失败的C代码:
#include#include #include /*快速排序*/ void quickSort(int a[],int left,int right) { int i,j,temp; i=left; j=right; temp=a[left]; if (left>right) return; while(i!=j) { while(a[j]>=temp && j>i) j--; if(j>i) a[i++]=a[j]; while (a[i]<=temp && j>i) i++; if(j>i) a[j--]=a[i]; } a[i]=temp; quickSort(a,left,i-1); quickSort(a,i+1,right); } void main() { int i,z; int red,blue; int count_rand_di; int di[6]; char result_di[30]=""; z=0; while(z<6) { srand(time(0)); red=1+(int)(33.0*rand()/(RAND_MAX+1.0)); count_rand_di=0; for(i=0;i 编译命令:
gcc rand.c -o rand -Wall参考资料:
http://baike.baidu.com/view/19016.htm
python的聪明组合
一直在买双色就是没有中过,看过高人指点,根据“聪明组合”写了这个脚本。在技术上没有任何难度,都是体力活。为了大家方便。
运行脚本输入12个红球数,组合成10组。然后在自己加上篮球即可。
#!/bin/env python # -*- coding:utf-8 -*- # ------------------------------------------- # Filename: clever12.py # Revision: 1.0 # Date: 2012-3-13 # Author: simonzhang # WEB: www.simonzhang.net # Email: simon-zzm@163.com # ------------------------------------------- def run_group(di): fen = di.split(' ') A = fen[0] B = fen[1] C = fen[2] D = fen[3] E = fen[4] F = fen[5] G = fen[6] H = fen[7] I = fen[8] J = fen[9] K = fen[10] L = fen[11] print("%s %s %s %s %s %s"%(A,B,D,E,K,L)) print("%s %s %s %s %s %s"%(A,B,E,F,H,I)) print("%s %s %s %s %s %s"%(A,B,E,G,I,K)) print("%s %s %s %s %s %s"%(A,B,E,I,J,L)) print("%s %s %s %s %s %s"%(A,C,D,E,F,L)) print("%s %s %s %s %s %s"%(A,C,D,G,H,J)) print("%s %s %s %s %s %s"%(A,C,D,I,K,L)) print("%s %s %s %s %s %s"%(A,C,F,G,H,L)) print("%s %s %s %s %s %s"%(A,C,F,H,J,K)) print("%s %s %s %s %s %s"%(A,D,F,G,J,L)) def main(): get_list = raw_input("12 number :") if len(get_list) == 35: run_group(get_list) else: print "input error" if __name__ == "__main__": main()