晚上好,亲爱的用户,
我需要你的帮助,我粗略地说,一个工作人员使用以下命令从文件中获取给定数据tail -n + x path/to/file | head -n50,但随着每次重复迭代,脚本的执行时间都会增加
代码示例:
$p = 'UploadFiles/million_test.txt';
$l = 0;
$i = 0;
$开始=微时间(真);
做 {
$command = "tail -n+$l $p | head -n50";
执行($命令,$数据);
$计数 = 计数($数据);
如果($count == 0){
死;
}
$i++;
$l += 500;
如果 ($i % 100 == 0) {
file_put_contents(
'测试.txt',
"$l [$count] =>" . 圆((微时间(真) - $开始),2)。
PHP_EOL,
文件附加
);
$开始=微时间(真);
}
取消设置($数据);
} while ($count > 0);
脚本执行数据
50000 [50] =>0.71
100000 [50] =>0.9
150000 [50] =>1.09
200000 [50] =>1.19
250000 [50] =>1.35
300000 [50] =>1.44
350000 [50] =>1.58
400000 [50] =>1.66
450000 [50] =>1.65
如您所见,经过几次迭代后,脚本执行时间增加了 2 倍。
也许有人知道我做错了什么?
或者至少提示要阅读的内容,我将不胜感激。
million_test.txt文件有大约 1200 万个条目。
一般来说,这都是可以理解的。最有可能的是,由于 tail 命令需要更长的时间,因此迭代时间会增加。那些。这里的问题不是您的代码,而是tail的工作方式。
那些。当您“要求”提供文件的最后 500 行时,该命令会读取这 500 行并输出。当你请求接下来的 500 行时,命令读取 1000 行并输出它们,然后通过head你只需要其中的 500 行。
在下一次迭代中, tail已经读取了 1500 行。等等。等等 越接近文件开头,需要读取和输出的行越多,命令耗时越长。
在这个实现中没有什么可做的。目前还不完全清楚您要解决什么问题。但也许更理想和更快速的方法是使用 PHP 打开此文件并一次一行地读取它。并在必要时分成块。或者做点别的。
该命令从文件中读取所有 (-n+$l) 行,然后获取其中的上半部分 (-n50) 这种方法本身非常慢。
file($p)对此好多了,下面是每1m行读取生成文件速度的对比测试