>  기사  >  백엔드 개발  >  PHP에서 1억 개의 숫자를 정렬합니다.

PHP에서 1억 개의 숫자를 정렬합니다.

巴扎黑
巴扎黑원래의
2016-11-22 10:05:381213검색

수천 개의 부분으로 나누고 다시 정렬하고 병합하세요.


먼저 1억 개의 QQ 번호가 포함된 txt를 생성하세요.

PHP코드?



//QQ 번호 1억개 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 = 범위($v*10000+10000,10000*($v+1)+9999);

shuffle($arr);

fputs($fp,implode("n", $arr)."n");

unset($arr);

}

echo microtime(true)-$st;

?>






1억 개의 무작위 QQ가 생성될 때까지 1~2분 정도 기다리세요.

QQ 번호 범위는 >10000입니다. 파일 크기는 약 840MB입니다.



다음은 수천개의 파일로 분류됩니다.

폴더는 QQ번호 길이로, 파일명은 QQ번호 앞 3자리를 사용하세요.

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 = 폭발("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 코드?



 

// 정렬 완료(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을 $v로 표시)

    {

        if ($v != '.' && $v != '..')

        {

            $file = $root. '/' . $키 . '/'. $v;

            $c = file_get_contents($file);

           $arr = explode("n", $c);

            sort($arr);

           fputs($qq_done, implode("n",$arr));

            연결 해제($file);

        }

    }

    rmdir($root. '/' . $key);

}

rmdir($root);

 

에코  마이크로타임( true)-$st;

 

?>

   



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.