鉴于,我将不胜感激任何帮助.
我有7个单独的阵列与约.每个数组中有90,000个数字(我们称之为arrays1-arrays7).每个数组本身都没有重复的数字.但是,阵列之间可能存在重复.例如,array2没有重复项,但可以使用与arrays3和arrays4相同的数字.
问题:一旦所有7个阵列合并,我试图识别所有重复3次的数字.
我必须进行1000次计算,需要15分钟,但这不行,因为我必须运行40次 - 代码:
如果您知道另一种最适合此类计算的语言,请告诉我.任何扩展建议,如redis或gearman都有帮助.
for($kj=1; $kj<=1000; $kj++) { $result=array_merge($files_array1,$files_array2,$files_array3,$files_array4,$files_array5,$files_array6,$files_array7); $result=array_count_values($result); $fp_lines = fopen("equalTo3.txt", "w"); foreach($result as $key => $val) { if($result[$key]==3) { fwrite($fp_lines, $key."\r\n"); } } fclose($fp_lines); }
我也用字符串尝试了下面的代码,但是array_map调用和array_count值调用需要17分钟:
for($kj=1; $kj<=1000; $kj++) { $result=''; for ($ii = 0; $ii< 7; $ii++) { $result .= $files_array[$hello_won[$ii]].'\r\n'; } $result2=explode("\n",$result);//5mins $result2=array_map("trim",$result2);//11mins $result2=array_count_values($result2);//4-6mins $fp_lines = fopen("equalTo3.txt", "w"); foreach($result2 as $key => $val) { if($result2[$key]==3) { fwrite($fp_lines, $key."\r\n"); } } fclose($fp_lines); unset($result2);
////////////////////////////////////////////////// /
@ziumin @ailvenge @scunliffe @ this.lau_ @monocell感谢所有发帖的人!我正在处理你的所有建议,并在我完成所有答案后明天接受答案.非常感谢!
array_merge()
因为(来自php.net),数组中的元素越多,速度就越慢:
如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个键.但是,如果数组包含数字键,则后面的值不会覆盖原始值,但会附加.
带有数字键的输入数组中的值将使用从结果数组中的零开始的递增键重新编号.
所以这个函数实际上是在做一些条件语句.您可以使用正常添加替换数组合并,包括循环(foreach或任何其他)和[]
运算符.你可以编写一个模拟array_merge的函数,比如(使用引用不复制数组..):
function imitateMerge(&$array1, &$array2) { foreach($array2 as $i) { $array1[] = $i; } }
你会看到速度的提高真的很难.