2017-10-16 44 views
0

我的脚本合并了18个文件,并返回合并中出现> = 13次的所有数字。我计时脚本和array_count_values是如此之慢,它占2.35秒时间的80%。这些文件很大,每个文件有200,000个数字,所以合并后的数组超过200万。PHP:因为速度太慢而无array_count_values而获得结果的更好方法

任何想法,我可以踢出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("https://stackoverflow.com/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 
+0

你可以使用'fread'超过您的文件和*运行*仅算你作为很有趣的事情你会看到数据飞过。从你发布的代码中,没有任何理由将任何东西留在内存中,所以为什么还要花费构建一个数组;就算了。 –

+1

数据库是不可能的? – chris85

+0

是的,一个数据库是不可能的,因为我确实有一个数据库,它比现在的脚本慢了很多。我简单地和一个数据库人员交谈,他们说,用我拥有的数量来说,我需要至少有10年经验的人为我设置一些东西。 – user3152377

回答

0

我认为在foreach IST快,但我没有测试它

foreach ($somearray as $somearrayelement) { 
    $frequency[$somearrayelementkey]++; 
} 
+0

嗨,我正在尝试测试这个现在,但我不知道你的代码段中发生了什么......我粘贴它的频率应该去,但有一些调用堆栈错误...你能解释片段的工作原理吗?谢谢。 – user3152377