为什么;LC_ALL=C";“不能加速”;bzgrep“;
对于仅涉及ASCII的情况,我们可以使用为什么;LC_ALL=C";“不能加速”;bzgrep“;,grep,Grep,对于仅涉及ASCII的情况,我们可以使用LC_ALL=C显著加快grep过程。 由于bzgrep与grep非常相似,因此我也尝试采用这种方法。结果证明这没什么帮助。 我使用的命令行如下所示: $ time bzgrep Debug 001.log.bz2 | sed -n '/^09:00/ , /^09:30/p' | grep "Pattern1.*Pattern2" > /dev/null $ time LC_ALL=C bzgrep Debug 001.log.bz2 | sed
LC_ALL=C
显著加快grep
过程。
由于bzgrep
与grep
非常相似,因此我也尝试采用这种方法。结果证明这没什么帮助。
我使用的命令行如下所示:
$ time bzgrep Debug 001.log.bz2 | sed -n '/^09:00/ , /^09:30/p' | grep "Pattern1.*Pattern2" > /dev/null
$ time LC_ALL=C bzgrep Debug 001.log.bz2 | sed -n '/^09:00/ , /^09:30/p' | grep "Pattern1.*Pattern2" > /dev/null
更新:
$ time bzgrep
real 1m51.686s
user 1m52.310s
sys 0m6.682s
$ time LC_ALL=C bzgrep
real 1m51.835s
user 1m52.455s
sys 0m6.738s
$ time grep
real 1m9.553s
user 1m3.189s
sys 0m2.120s
$ time LC_ALL grep
real 0m4.136s
user 0m3.187s
sys 0m0.946s
假设bzgrep没有完全忽略LC_,那么您可能会看到一个性能瓶颈,其中解压缩性能首先限制了实际grep代码获取数据的速度,从而使实际grep代码的速度在很大程度上没有实际意义 以汽车为例,假设你有两组洗车机,一组可以在一分钟内洗车,另一组需要五分钟。你有十辆车要洗。一队在十分钟内洗了十辆车;另一队在50分钟内洗了10辆车 现在假设你有一个消防队长,他不喜欢一次有那么多的车,他决定通过让一辆车进入洗车场来解决这个问题,正好是在每小时的顶部。因此,每一个车队都会完成自己的赛车,然后等待55或59分钟等待下一辆 在这种情况下,第一组在一分钟内得到一辆车并清洗它,等待一个小时,清洗另一辆车,等等。他们在开始清洗第一辆车九小时后开始清洗第十辆车,因此总共需要九个小时零一分钟。第二个团队也做同样的事情,但是洗最后一辆车需要5分钟,所以总共需要9小时5分钟
同样,如果grep部分比解压缩部分快得多,那么假设您有一个多核CPU,那么总时间只取决于解压缩数据所需的时间加上grep最后一块数据所需的时间。bzip单个文件。比较
grep
,LC\u ALL=C grep
,bzgrep
和LC\u ALL=C bzgrep
。“现在几点了?”瑞安♦ LC_ALL=C grep
比grep
快得多,而LC_ALL=C bzgrep
和bzgrep
几乎相同。这个差异正是我所困惑的。实际数字是多少?谢谢你的快速回复。我已经更新了原来的帖子,但看不出这有什么帮助:-)这是有道理的。我们可以加快bzgrep
(或其他替代方法,而不是bzgrep
读取压缩文件)的速度吗?pbzip2 | grep,假设管道的开销不会破坏并行化带来的性能提升。