php排序1亿个号码_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > php排序1亿个号码

php排序1亿个号码

 2013/9/15 17:46:19  wbj0110  程序员俱乐部  我要评论(0)
  • 摘要:拆开分成几千份进行排序再合并。首先先创建一个1亿个QQ号的txt。PHPcode?1234567891011121314151617181920212223<?php//创建一亿个QQ号的txt(大约需85~100秒)set_time_limit(0);$fn='qq.txt';$fp=fopen($fn,'w');$st=microtime(true);$l=range(0,10000);shuffle($l);foreach($las$k=>$v){$arr=range
  • 标签:PHP

拆开分成几千份进行排序再合并。


首先先创建一个1亿个QQ号的txt。

PHP codeclass="clipboardWindowBtn">? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 monospace !important;"><?php ? //?创建一亿个QQ号的txt?(大约需85~100秒) ? set_time_limit(0); $fn?=?'qq.txt'; $fp?=?functions" style="margin: 0px !important; padding: 0px !important; border: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; float: none !important; height: auto !important; line-height: 1.1em !important; overflow: visible !important; vertical-align: baseline !important; width: auto !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; color: #ff1493 !important;">fopen($fn,?'w'); ? $st?=?microtime(true); ? $l?=?range(0,10000); shuffle($l); foreach?($l?as?$k=>$v) { ????$arr?=?range($v*10000+10000,10000*($v+1)+9999); ????shuffle($arr); ????fputs($fp,implode("\n",?$arr)."\n"); ????unset($arr); } ? echo??microtime(true)-$st; ? ?>



?

稍等一两分钟1亿个随机QQ创建完成了。

QQ号码范围为>10000。文件大小大概有840MB。



下面就进行分类划分成几千份文件。

以QQ号码长度为文件夹,QQ号码前3位为文件名

PHP code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <?php ? //?长度号码分类?(大约需360~400秒) ? set_time_limit(0); $st?=?microtime(true); ? if(!is_dir('qq_no'))?mkdir('qq_no'); $file?=?fopen('qq.txt',?'r');? ? ? $i=0; $end_s?=?''; while(!feof($file)) { ????$g?=?1042*1024; ????fseek($file,$g*$i); ????$s?=?fread($file,?$g); ? ?????? ????$end?=?strrpos($s,?"\n"); ????$arr_s?=?$end_s.substr($s,?0,?$end); ????$end_s?=?substr($s,?$end); ? ????$arr?=?explode("\n",?$arr_s); ????foreach?($arr?as?$k=>$v) ????{ ????????if($v!='') ????????{ ????????????$tag?=?"$v[0]$v[1]$v[2]"; ????????????$text_arr[strlen($v)][$tag][]?=?$v; ????????} ????} ? ????foreach?($text_arr?as?$k=>$v) ????{ ????????$n_dir?=?'qq_no/'.$k; ????????if?(!is_dir($n_dir))?mkdir($n_dir); ????????foreach?($v?as?$tag=>$val) ????????{ ????????????$n_tf?=?fopen($n_dir.'/'.$tag.'.txt',?'a+'); ????????????fputs($n_tf,implode("\n",$val)."\n"); ????????} ????????? ????????? ????} ????unset($text_arr); ? ????++$i; ? } ? echo??microtime(true)-$st; ? ?>





最后就要每个文件进行排序合并数据了。

PHP code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <?php ? //?排序完成拉?(800~920秒) ? set_time_limit(0); $st?=?microtime(true); ? $qq_done?=?fopen('qq_done.txt',?'a+'); ? $root?=?'qq_no'; $dir_array?=?scandir($root); ? foreach?($dir_array?as?$key=>$val) { ????if?($val?!=?'.'?&&?$val?!=?'..') ????????$dirs[$val]?=??scandir($root.'/'.$val); } ? ? foreach?($dirs?as?$key=>$val) { ????foreach?($val?as?$v) ????{ ????????if?($v?!=?'.'?&&?$v?!=?'..') ????????{ ????????????$file?=?$root.?'/'?.?$key?.?'/'.?$v; ????????????$c?=?file_get_contents($file); ????????????$arr?=?explode("\n",?$c); ????????????sort($arr); ????????????fputs($qq_done,?implode("\n",$arr)); ????????????unlink($file); ????????} ????} ????rmdir($root.?'/'?.?$key); } rmdir($root); ? echo??microtime(true)-$st; ? ?>
发表评论
用户名: 匿名