您的位置:首页 > 编程语言 > Python开发

玩蛇记--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编程(求推荐教程)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: