为什么;LC_ALL=C";“不能加速”;bzgrep“;

为什么;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

对于仅涉及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 -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,假设管道的开销不会破坏并行化带来的性能提升。