拆开分成几千份进行排序再合并。
首先先创建一个1亿个QQ号的txt。
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
?
//?长度号码分类?(大约需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
?
//?排序完成拉?(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
;
?
?>