【发布时间】:2017-10-16 19:23:29
【问题描述】:
我的脚本合并了 18 个文件并返回在合并中出现 >=13 次的所有数字。我对我的脚本进行了计时,并且 array_count_values 太慢了,它占了 2.35 秒时间的 80%。文件很大,每个文件有 200,000 个数字,因此合并后的数组远远超过 200 万。
有什么想法可以退出 array_count_values 函数或以更好的方式编写它,并且仍然返回合并数组中出现 >= 13 次的所有数字?
注意:我缩短了代码以反映 18 个要合并的文件中只有 3 个。
for($b=0; $b<1; $b++)
{
echo $b."\n";
for($a=0; $a<10; $a++)
{
for($i=0; $i<30; $i++)//30
{
$linespreset=file_get_contents("/users/history/".$folder."/".$round."/masterspeedrandom_randompick_less13_".$b."_".$a."_".$i.".txt");
$holdpreset=explode(" ",$linespreset);
$holdpreset=array_map("trim", $holdpreset);
$print1=file_get_contents('/users/'.$a.'/masterspeed_round3_xxx_'.$holdpreset[0].'.txt');
$print2=file_get_contents('/users/'.$a.'/masterspeed_round3_xxx_'.$holdpreset[1].'.txt');
$print3=file_get_contents('/users/'.$a.'/masterspeed_round3_xxx_'.$holdpreset[2].'.txt');
$healthy = " ";
$yummy = "_";
$print1= strtr($print1,$healthy,$yummy);
$print2= strtr($print2,$healthy,$yummy);
$print3= strtr($print3,$healthy,$yummy);
$resultround=$print1."\r\n".$print2."\r\n".$print3."\r\n".$print4."\r\n".$print5."\r\n".$print6."\r\n".$print7."\r\n".$print8."\r\n".$print9."\r\n".$print10."\r\n".$print11."\r\n".$print12."\r\n". $print13."\r\n".$print14."\r\n".$print15."\r\n".$print16."\r\n".$print17."\r\n".$print18;
$somearray = str_word_count($resultround, 1, '1234567890:@&_');
$frequency = array_count_values($somearray);
$result = array_filter($frequency, function ($x) { return $x >=13; });
unset($somearray);
}//END OF I
}//END OF A
}//END OF B
【问题讨论】:
-
您可以使用
fread来遍历您的文件,并仅在您看到数据飞逝时计算您感兴趣的事物。从您发布的代码来看,将任何内容保留在内存中的理由为零,所以为什么还要费心构建数组;数数。 -
数据库不行?
-
是的,数据库是不可能的,因为我确实在数据库中拥有它,而且它比我现在拥有的当前脚本慢。我与一位数据库人员进行了简短的交谈,他们说以我拥有的数字数量,我需要至少有 10 年经验的人来为我设置。
-
@Mike'Pomax'Kamermans 感谢您的回复!我不明白你所说的“只数”与 fread 是什么意思。你能指出我如何设置的方向吗?非常感谢。
-
数据库查询将在此清除 PHP。如果你的速度很慢,那是因为你的查询不好
标签: php arrays performance large-files