业界动态
Python处理海量手机号码
2024-10-31 18:50

一、任务描述

上周,老板给我一个小任务:批量生成手机号码并去重。给了我一个Excel表,里面是中国移动各个地区的可用手机号码前7位(如下图,里面有十三张表,每个表里的电话号码前缀估计大概是八千个,需要这些7位号码生成每个都生成后4位组成11位手机号码,也就说每一个格子里面的手机号码都要生成一万个手机号。而且还有,本来服务器已经使用了一部分手机号码了,要在生成的号码列表里去掉已经使用过的那一批。已经使用过的这一批号码已经导出到了一批txt文本里,约4000w,每个txt有10w个号码,里面有重复的,老板估计实际大概是3000w左右。老板可以给我分配使用一个16G内存、8核CPU的Windows服务器来跑程序。

Python处理海量手机号码

二、任务分析

要处理海量数据,所以程序的执行效率和占用内存不能太高,应该能在开发机的4G内存下也大概跑得动,即关掉所有编程IDE和服务器软件,只用Notepad++和浏览器(用来查资料)的情况下不会卡机。这次任务可能会用到的技术有:程序Excel的处理,文件的遍历和读写,大型数组的操作,多线程并发。预估任务完成周期:一周(日常工作正常进行的前提下)。

三、技术分析

PHP:很熟悉,但是执行效率和内存占用不够好,可能会卡机,要实现多线程似乎有点复杂。(有待斟酌

Javascript:较熟悉,执行效率和内存占用不太清楚,但是弱类型通常都比较堪忧,各种回调比较干扰思维不顺手。(不考虑

Java:略懂,学起来和写起来都比较麻烦,开发效率比较慢。(有待斟酌

C#:没用过,较难学(比JAVA易,比脚本难)。(有待斟酌

C/C++:略懂,数组处理、多线程这两个似乎比较难搞。(不考虑

Python:没用过,据说很容易学,有个研究生同学用它来做物理运算等,执行效率应该不低。(试试看

于是就打着试试看的心态,打开了菜鸟教程(Runoob)的Python教程大概看了一下,目录中有几个数组(List、元组、字典)、文件IO、File和多线程,看了一下例程果然好简单。再度娘了一下python处理Excel,果断简单快捷!于是开启了玩蛇之路。

四、合并(https://blog.csdn.net/three_bird/article/details/4000w/hebing.py)

本文开头说到,有4000w的已用号码列表,但是里面是有重复的,而后面的处理都需要用到这些号码。而看到这400多个txt文件加起来大小约500M,所以全部读进去再进行处理也可以承受。所以先把这些文件读进去合并去重,输出成为一个txt文件。最后得到的号码有1800w多条,输出txt文件大小约209M。

其中对数组内的元素进行合并去重的那一句是 txtArr = list( set(txtArr) ) 。很神奇对吧,这两个是什么函数?其实这两个都是转换类型的函数。先把它转换成了 set 类型,再转换为 list 类型(列表/数组)。python的set(集合)类型是一个无序不重复的元素集,所以list转换为set之后就自动去重了,当然同时顺序也会被打乱了,不过这里的顺序不重要就不用管它啦。

最后数组转换为字符串也是直接用字符串拼接数组就转换了,不要用for循环,非常非常耗时间的。

五、Excel处理(https://blog.csdn.net/three_bird/article/details/preNum.py)

根据网上例程直接读取Excel第一个表里面的内容出来,合并成数组转成字符串存到文本里面去。在转成字符串的时候发现报错似乎是说数据类型不对,才知道原来python与PHP、JS不同,是强类型的=_=!于是先在Excel里把表里面的数据转换成字符串格式(excel里准确叫文本格式,转换后excel表里面的数据格左上角是有绿色的小三角形的。每个表单独处理生成一个文件,一个文件里面大概有八千个手机号码前缀。

六、生成号码并去掉已用过的

首先来想想,有十三个表,一个表里面有大概八千个号码前缀,每个前缀生成一万个号码,每个号码要与前面所说的1800万的已用手机号码进行比对去重。你会怎么做呢

我的想法是,分成十三次来做,每次一个表,每个表中八千多个号码,使用多线程,八千多个线程,每个线程生成一万个号码并与那1800万个号码一 一比对。

其中生成和去重的核心代码如下,每生成一个号码的时间大概是0.5秒。所以估计了一下时间,10000*0.5s ≈ 83min,八千个线程大概要一个半小时左右。

我在本机大概运行了一下,观察了几分钟,似乎线程创建得比较慢,有些已经跑到了十几个了,有的才刚创建线程。线程调度嘛,不按照顺序嘛,除了输出很乱以外,似乎也没有什么其它问题。于是就上传到服务器上去跑了,然后再过了一会就下班回家了。第二天回到公司,连上服务器看看,出乎意料啊,看到输出的信息里面,那些线程才跑到 三百多,天呐什么时候才能跑到一万啊。而且还有坑爹的是,偶尔就看到有些线程创建失败⊙o⊙

七、思考思考(https://blog.csdn.net/three_bird/article/details/doData.py)

从前面的运行信息来看,这里使用多线程似乎并没有加快程序的运行啊,这是为什么呢?如果不能用多线程,那么生成比对的地方就要改成另外更高效的方式了,有吗

第一问,从网上找到答案,确实说在计算密集型程序中,多线程比单线程更糟,因为一个CPU就那么几个核,不同的线程还是一样要占用CPU资源,再加上线程调度的时间和空间,真是天坑。第二问,PHP中有从一个数组去除另一个数组的函数(官方说法叫做数组的差集 array_diff() ),那么python应该也会有这样的函数,先成一万个号码的数组再进行差集 会不会比原来 每个号码对比再合并效率快呢

实践了一下,证明确实效率高了极多极多,python中的数组差集是这个样子的 numArr = list( set(numArr) - set(bugTxtArr) ) 测了一下,大概三秒完成一批号码(一批约等于一万个号码,之前是半秒一个号码\( ^▽^ )/。但也注意现在生成的一万个号码排序是乱的,因为中间转换成的set类型是无序的,如果需要从小到大排序,那还要再加个函数排序一下,问了老板说不用按顺序,那就直接这样了。

期间调试的时候发现,使用多线程有时会报错 Unhandled exception in thread started by sys.excepthook is missing 之类的,网上查资料说是因为主进程已经执行完毕,那么其创建的线程就会被关掉。所以我的做法就是让主进程最后为一直执行空语句,很像当年用C语言做单片机的做法呢→_→虽然最后不用多线程了,直接单线程处理,安全稳定。

八、合并整理(https://blog.csdn.net/three_bird/article/details/hbData.py)

    以上就是本篇文章【Python处理海量手机号码】的全部内容了,欢迎阅览 ! 文章地址:http://lianchengexpo.xrbh.cn/news/12627.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 迅博思语资讯移动站 http://lianchengexpo.xrbh.cn/mobile/ , 查看更多   
最新新闻
刘畊宏直播2小时收入120万,打赏的榜一大哥都是什么人?
说起最近这段时间直播界最火的网红明星,非“健身达人”刘畊宏莫属,从今年4月初开始,全国各地都有人因疫情被封控,而刘畊宏的
国家要普涨工资,地方正狂卷就业,让大家挣钱最重要
最近,有一个重要的文件和每个人的“钱袋子”息息相关。那就是《中共中央、国务院关于实施就业优先战略促进高质量充分就业的意见
实探债务危机中的柔宇科技:生产基地半小时只看到3个人,手机业务已停摆
2023年是折叠屏手机爆发年,诸多柔性屏供应商、手机厂商吃到红利。然而面对这样的好光景,柔宇科技却只剩一片残局。曾经凭借柔性
今日头条iphone最新版特色
今日头条ios2021最新版是专为苹果手机用户打造的头条新闻资讯应用,打开今日头条,即可知道今天发生了哪些大事,还有最新的娱乐
一张床垫用N年,弹簧早就疲软了,撑不住儿童发育的脊梁,赶紧换!
你家孩子睡的弹簧床垫陪伴TA多少年了?尤其是弹簧床垫,通常睡上3~5年的儿童床垫,金属弹簧就会呈现不同程度的疲软,这将严重影
增长黑客,创业公司用户增长的秘籍
增长黑客读了范冰的《增长黑客》,启发太多。正如作者在前言中所说,确实是处处均是干货,书里脉络清晰,是本难得的好书。增长黑
实用的高考化学考试答题思路与技巧
高考的化学考试答题要联系所学习的知识,找到知识与问题之间的结合点,确定解题的方案,这才是解题的关键。下面是小编为大家整理
小红书情人节营销指南
│前言│小红书作为女生的口袋百科指南,提供了各种各样的节日攻略内容,同时引导着用户去享受更好的生活,而在即将到来的214情
云南SEO优化如何让描述中出现地址呢?
在搜索引擎优化(SEO)的世界中,整合关键信息,如地址,到网页描述中是提升网站在搜索引擎结果页面上的可见性和点击率的关键策
实用贴!海关统计数据查询攻略
海关统计数据查询攻略为便于社会公众查询和使用海关进出口货物贸易统计数据(以下简称海关统计数据),特编制本查询攻略。一定期
本企业新闻
推荐企业新闻

点击拨打: