php排序1亿个号码

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


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

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
<?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 ($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;
 
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值