【发布时间】:2014-06-14 10:15:37
【问题描述】:
如果有任何帮助,我将不胜感激。
我有 7 个单独的数组,大约有 7 个数组。每个数组中有 90,000 个数字(我们称它们为数组 1-数组 7)。每个数组本身没有重复的数字。但是,数组之间可能存在重复。例如,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);
【问题讨论】:
-
您正在写入循环内的文件。这不是需要时间吗?您需要多久对这 90,000 个元素进行一次排序?如果它只是一次,也许不管它有多慢都做。如果需要定期完成,您需要一些方法来进行优化(也许通过在将每个元素添加到数据库时为每个元素维护一个计数器)。
-
我和你的想法一样,是写调用很多,但是当我调查时,写时间是微不足道的。这个问题完全属于array_merge。 @this.lau_
-
您能否让我们更深入地了解您的数据,以帮助我们找到最佳解决方案?例如(周日、周一、周二、周三、周四、周五、周六)有 7 个数组吗?数组中的数字有多大?例如
34, 47, 21或337894294529243592, 38439434949238, 39859893922242?你猜这 7 个数组中有多少百分比是重复的?一式三份,等等?需要这样做 1000 次和 40 次是什么意思? -
@scunliffe 当然!希望这个信息能让事情更清楚——这 7 个数组的数字长度在 10 到 5 个字符之间。这意味着一个数字可能看起来像这样 3456777890 或 34567。我猜一式三份的百分比约为 30%。 7 个数组组合永远不会相同,并且有 1000 个组合必须检查它们的一式三份。其他 40 次与解决方案无关,array_merge 需要 40 分钟,我的其余代码与 fwrite 调用相结合需要 1 分钟。 fwrite 是微不足道的,绝对不是问题。感谢您的帮助。
标签: php arrays performance optimization