晚上好,亲爱的用户,
我需要你的帮助,我粗略地说,一个工作人员使用以下命令从文件中获取给定数据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行读取生成文件速度的对比测试