玩蛇记--Python处理海量手机号码
2016-04-22 19:42
281 查看
一、任务描述
上周,老板给我一个小任务:批量生成手机号码并去重。给了我一个Excel表,里面是中国移动各个地区的可用手机号码前7位(如下图),里面有十三张表,每个表里的电话号码前缀估计大概是八千个,需要这些7位号码生成每个都生成后4位组成11位手机号码,也就说每一个格子里面的手机号码都要生成一万个手机号。而且还有,本来服务器已经使用了一部分手机号码了,要在生成的号码列表里去掉已经使用过的那一批。已经使用过的这一批号码已经导出到了一批txt文本里,约4000w,每个txt有10w个号码,里面有重复的,老板估计实际大概是3000w左右。老板可以给我分配使用一个16G内存、8核CPU的Windows服务器来跑程序。#!/usr/bin/python # -*- coding: UTF-8 -*- import os def hebing( filesArr ): global tblIndex; i = 0; newStr = ''; filesArrLen = len(filesArr); #print filesArr; for file in filesArr: txtStrAll = ''; fileobj = open('cellNum'+str(tblIndex)+'/'+filesArr[i]); txtStr = fileobj.read(); fileobj.close(); txtStrAll += txtStr+'\n'; txtArr = txtStrAll.splitlines(); #分割成数组 #全部在开头加上+86 arrLen = len(txtArr); #print arrLen; for j in range(0, arrLen): txtArr[j] = "+86"+txtArr[j]; #转成字符串 newStr += '\n'.join(txtArr); i += 1; #每10个文件写入txt,注意最后的不足十个的时候 if not i%10 : #print i; newFileObj = open('resList'+str(tblIndex)+'/'+str(i)+'.txt', "wb"); newFileObj.write( newStr ); newFileObj.close(); newStr = ''; elif i==filesArrLen : #print i; newFileObj = open('resList'+str(tblIndex)+'/'+str(i)+'.txt', "wb"); newFileObj.write( newStr ); newFileObj.close(); newStr = ''; #把所有的文本都读出来 tblIndex = 1; rootDir = os.getcwd()+"\cellNum"+str(tblIndex); #print rootDir; for parent,dirs,files in os.walk(rootDir): # print files; #得到一个文件名List,按文件名排序的 # hebing( files[0:15] ); #测试 hebing( files ); """ i = 1; txtStrAll=''; while i<= 402: #402 fileobj = open('list-data- ('+ str(i) +').txt'); txtStr = fileobj.read(); txtStrAll += txtStr+'\n'; fileobj.close(); i+=1; txtArr = txtStrAll.splitlines(); #分割成数组 print len( txtArr ); #39905386 txtArr = list(set(txtArr)); #去重 print len( txtArr ); #18316857 #合并成字符串,for in会要很久很久 newStr = ''; newStr = '\n'.join( txtArr ); #写入txt newFileObj = open('list-dataAll.txt', "wb"); newFileObj.write( newStr ); newFileObj.close(); """
hbData.py
后话,总共只有十三个表,这些程序稍微改一下,执行十三次就行了。值得注意的是,我这里的程序几乎每个都有一个全局变量 tblIndex, 是以防一文件里面一个个修改目录名和文件名,疏忽有可能导致的数据覆盖。
总结
使用脚本语言有一个很重要的要点:要尽量用语言提供的函数,不要自己实现算法,尤其是循环的那种,执行速度不在一个数量级。处理大批量的数据,要拆分步骤,生成中间文件。大量数据复杂操作要小批量小批量地慢慢调试,结果无误才逐步切换成真实数据。
多线程在运算密集型的场景中是没有用武之处的,就算CPU是多核也没什么用,反而会造成顺序随机不易观察,线程不稳定容易出错,线程间切换内存消耗加大等弊端。
据说GPU可以用来挖矿、暴力破解等,对本场景这种高并发、简单逻辑的运算应该也非常适用,以后可能要用得上GPU编程(求推荐教程)。
相关文章推荐
- python学习一些细节
- python模块:smtplib模块
- python模块:smtplib模块
- python 试验7 简单抽奖程序
- python学习笔记(19-20)
- python学习笔记(15-18)
- python 从数据库表生成model
- python学习笔记(12-14)
- python学习笔记(7-11)
- python学习笔记(1-6)
- Python で Curses プログラミング
- python的collection系列-默认字典(defaultdict)
- python之logging模块
- python&DBA 一(自动安装热备备份并搭建复制)
- Python练习 - 廖雪峰教程
- SubLime Text 3配置Python环境 (windows下)
- python的collection系列-有序字典(OrderedDict)
- 利用python实现对鼠标的移动点击操作
- 用Python登陆武汉理工大学无线校园网
- python解释器内建函数002