6月 06

linux 两个文件取交集命令

  有两个文件a和b,a中包含b中所有数据。需要找出a文件中包含b文件内容的数据。具体操作如下:
a.txt文件
http://www.simonzhang.net/msg?phone=12320421&msg=hfeaf
http://www.simonzhang.net/msg?phone=13219543&msg=efweff3
http://www.simonzhang.net/msg?phone=12765745&msg=f3fds
http://www.simonzhang.net/msg?phone=12432321&msg=3r2r322
http://www.simonzhang.net/msg?phone=14142142&msg=rgewo3
http://www.simonzhang.net/msg?phone=14212412&msg=iv9e
http://www.simonzhang.net/msg?phone=12321243&msg=e

b.txt文件
12320421
12432321
12321243

  查找a对b的交集命令:grep -f b.txt a.txt
结果如下:
http://www.baidu.com/msg?phone=12320421&msg=hfeaf
http://www.baidu.com/msg?phone=12432321&msg=3r2r322
http://www.baidu.com/msg?phone=12321243&msg=e

举一反三,如果要找差集命令为:grep -v -f b.txt a.txt

5月 27

从mysql向redis中加载数据测试

  有测试显示reids如果使用持久化测试后效率会下降,所以不使用持久化。现在来测试一下从mysql中捞取数据加载到redis中的速度。
  服务器使用8核2.6 cpu,内存8G,sas硬盘,Centos5.6 64位操作系统。python 2.6 redis2.4.13.
  使用测试代码如下,从mysql的photo表中捞取两列数据加载到redis中,这两列在表中都有索引,数据量28万。

#!/bin/env python
# -------------------------------------------------
# Filename:    
# Revision:    
# Date:        2012-05-27
# Author:      simonzhang
# Email:       simon-zzm@163.com
# -------------------------------------------------
import MySQLdb
import redis


def redis_run(sql_data):
    try:
        r = redis.Redis(host='192.168.1.100', password = '123456', port=6379, db=0)
    except redis.RedisError, e:
        print "Error %s" % e
    for i in sql_data:
        r.set(str(i[0]),i[1])
        

def mysql_run(sql):
    try:
        db = MySQLdb.connect(host='192.168.1.100', user='test', passwd ='123456', db='photo')
        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 main():
    _loop = 0
    _limit_start = 0
    _limit_span = 10000
    _count_result = 5
    while _count_result > 0:
        result_data = ''
        sql = "select id as pid, userid as uid from photo LIMIT %s,%s" % (_limit_start + _limit_span * _loop, _limit_span)
        result_data = mysql_run(sql)
        _count_result = len(result_data)
        redis_run(result_data)
        _loop += 1


if __name__ == '__main__':
    main()

进行测试,分别为每次捞取50万,10万,5万,1万,结果如下:

50万
real 0m26.239s
user 0m16.816s
sys 0m5.745s

10万
real 0m24.019s
user 0m15.670s
sys 0m4.932s

5万
real 0m26.061s
user 0m15.789s
sys 0m4.674s

1万
real 0m28.705s
user 0m15.778s
sys 0m4.913s

结论:每次捞取10万效率会比较理想,对于操作系统的压力不大,所以硬件方面不用考虑。
这里两列保存的都是id,加入用户id和照片id长度都是9位,一组数据是18位。一亿组数据也就需要2G内存。
通过计算28万需要24秒,如果有1亿的数据,全部倒入要2个半小时。所以内存存储不是问题。不知道用固态硬盘是否能快,我没有就不知道了。所以要做三件事,一做好集群,将数据及时同步到其他机房,自己写个程序同步定时同步,如果用主从,主机重启了为空,这个就很麻烦了,二使用redis的数据持久化,肯定比从mysql中直接捞快,三天天烧香希望不要宕机。

5月 23

读《重说中国近代史》

  中国当今社会有很多公认的社会问题,百姓和官员、老者和青年、穷人和富人,在互相谴责着问题由对方产生。其实我们应该静下来,通过学习历史来了解此问题的产生的原因。真正的学校教育让大家对历史头疼不已,但是此书读起来却十分有趣。用历史来反思当今的问题,挖掘当今国人的劣根。
  书中写的“三妇心态”,“义和团运动”和“袁世凯的悲剧”让我对近代史有了更细节的了解,也很社会现象有了新的认识。比如中国当前的整体浮躁,总是有人在感慨,但是也搞不清何时开始问什么会这样,书中讲述,大清被打后,开始学习日本,后来学习美国,后来学习俄国,都是浮躁的表现,因为此三国都是学习的欧洲体系,而中国人看到了人家“快速致富”,就急急忙忙去学了并没有追踪寻缘,踏实下来从西方开始研究。日本、美国和俄国高速发展的时候,欧洲的体系也并不稳固,没有必要去学,但是也要研究,更不能拿着快速致富的套路直接套在自己的头上。
  十分推荐大家阅读。北洋裂变也不错,我之前买了,有空也拿出来再学习学习。
image