执行代码
<?php
$arr = file('arr.txt');
$sum = 0;
foreach ($arr as $key => $value) {
$sum = array_sum(array_slice($arr,$key,30));
if($sum > 50) {
echo $key . ' ' . $sum . "<br>";
}
}
?>
也就是说,我解释:
Суммирую по порядку диапазоны:
Сумма значений с 0 по 30
Сумма значений с 1 по 31
Сумма значений с 2 по 32
Сумма значений с 3 по 33
Сумма значений с 4 по 34
..
И так до конца.
我收到一个错误:
Fatal error: Maximum execution time of 180 seconds exceeded in E:\OSPanel\domains\arr\index.php on line 6
文件 arr.txt 是 200k 个整数(大约 0-100)
是否可以优化、加速功能?最好不要使代码复杂化 - 所以一切都从我的脑海中消失了。如果不可能 - 如何给时间执行?
一般来说,如果你有一个足够大的文件,无论算法多么优化,你仍然会遇到时间限制,对于明显大的任务,它是关闭的。
让我们看看什么以及如何影响性能。我生成了一个包含 200k 值的数组并将其写入文件。在生成结束时,使用的内存量 (
memory_get_usage()
) 为 29 MB。接下来,我关闭了时间限制
set_time_limit(0)
(我们假设长时间处理的主要原因是切片执行了200k次(切片本身并不长,但可能是内存管理器不断分配一些东西,而收集器将其销毁)。如果我们将其替换
array_sum(array_slice( ... ))
为手动计算元素总和的函数操作时间 - 1.4 秒。
下一个选项是计算前 30 个元素的总和。然后在数组中移动。减去第一个,添加下一个:
这里我稍微忽略了数组的末尾,实际上最后30个和都不算,但结果是0.25秒。
还有另一种选择 - 逐行读取文件。但是由于 如果您需要将当前的 30 个元素存储在一个数组中并每次移动/推送(以存储该 -30 个元素),那么它的性能将低于 ~0.35 秒,但您始终只存储 30 个值,而不是 200k,所以内存消耗将是最小的。
之前,我们这里已经考虑了前 30 行并总结了出来。
PS:以上所有代码断章取义,并不完整,只是为了传达意思
好吧,如果你没有混淆任何东西,那么你可以这样做 -