只是对上面给出的 3 个解决方案进行基准测试,这对我有用:
这 3 个解决方案的功劳归于:
- @boxxar
- @avandeursen
- @wds
- @manveru
- @sibaz
- @SOFe
- @fedorqui '停止伤害'
- @Robin A.米德
我正在使用我在服务器中找到的一个大文件:
# wc fo2debug.1.log
10421186 19448208 38795491134 fo2debug.1.log
38 Gb,1040 万行。
是的,我有一个 logrotate 问题。 :))
下注!
从文件开头获取 256 行。
# time sed -n '1001,1256p;1256q' fo2debug.1.log | wc -l
256
real 0m0,003s
user 0m0,000s
sys 0m0,004s
# time head -1256 fo2debug.1.log | tail -n +1001 | wc -l
256
real 0m0,003s
user 0m0,006s
sys 0m0,000s
# time awk 'NR==1001, NR==1256; NR==1256 {exit}' fo2debug.1.log | wc -l
256
real 0m0,002s
user 0m0,004s
sys 0m0,000s
Awk 赢了。 sed 和“head+tail”在技术上并列第二。
在文件前三分之一的末尾获取 256 行。
# time sed -n '3473001,3473256p;3473256q' fo2debug.1.log | wc -l
256
real 0m0,265s
user 0m0,242s
sys 0m0,024s
# time head -3473256 fo2debug.1.log | tail -n +3473001 | wc -l
256
real 0m0,308s
user 0m0,313s
sys 0m0,145s
# time awk 'NR==3473001, NR==3473256; NR==3473256 {exit}' fo2debug.1.log | wc -l
256
real 0m0,393s
user 0m0,326s
sys 0m0,068s
Sed 赢了。接着是“head+tail”,最后是 awk。
在文件的第二个三分之一的末尾获取 256 行。
# time sed -n '6947001,6947256p;6947256q' fo2debug.1.log | wc -l
A256
real 0m0,525s
user 0m0,462s
sys 0m0,064s
# time head -6947256 fo2debug.1.log | tail -n +6947001 | wc -l
256
real 0m0,615s
user 0m0,488s
sys 0m0,423s
# time awk 'NR==6947001, NR==6947256; NR==6947256 {exit}' fo2debug.1.log | wc -l
256
real 0m0,779s
user 0m0,650s
sys 0m0,130s
同样的结果。
Sed 赢了。接着是“head+tail”,最后是 awk。
在文件末尾附近获得 256 行。
# time sed -n '10420001,10420256p;10420256q' fo2debug.1.log | wc -l
256
real 1m50,017s
user 0m12,735s
sys 0m22,926s
# time head -10420256 fo2debug.1.log | tail -n +10420001 | wc -l
256
real 1m48,269s
user 0m42,404s
sys 0m51,015s
# time awk 'NR==10420001, NR==10420256; NR==10420256 {exit}' fo2debug.1.log | wc -l
256
real 1m49,106s
user 0m12,322s
sys 0m18,576s
突然,一个转折!
“头+尾”赢了。接着是 awk,最后是 sed。
(几个小时后...)
对不起各位!
我上面的分析最终成为分析中存在基本缺陷的一个例子。
缺陷在于不深入了解用于分析的资源。
在这种情况下,我使用了一个日志文件来分析在其中搜索一定数量的行的性能。
使用 3 种不同的技术,在文件的不同点进行搜索,比较技术在每个点的性能,并检查结果是否因文件中进行搜索的点而异。
我的错误是假设日志文件中的内容具有一定的同质性。
现实情况是,长行出现在文件末尾的频率更高。
因此,使用给定技术进行较长时间搜索(更接近文件末尾)更好的明显结论可能是有偏见的。事实上,这种技术在处理较长的行时可能会更好。还有待确认。