为什么 vim 搜索比 "cat fileName | grep targetText" 慢很多?

Why vim search is much slower than "cat fileName | grep targetText"?

我有一个名为 test.txt 的 1.4 GB 文本文件,我想在文件中搜索字符串。

我想知道为什么 vim 搜索(vim test.txt,然后输入 /targetText 来搜索字符串)执行起来比 cat test.txt | grep targetText?

在我的机器上,vim search 大约需要几分钟才能完成搜索,而 cat test.txt | grep targetText 大约需要几秒钟才能完成搜索。

Vim 是编辑。它会尝试将文件加载到内存中,然后您可以对其进行编辑。 Vim 可以编辑大文件,但没有针对它进行优化。

另一方面,Hand cat 和 grep 不需要读取内存中的整个文件。

顺便说一句,您可以不使用 cat.

直接执行 grep search file

如果 targetText 很短,延迟应该是由磁盘的大量加载引起的(需要搜索整个文本)。我们应该注意 vim 是一个交互式工具,它不是为快速处理千兆字节而设计的。当然,如果我们事先知道我们的模式匹配位于当前屏幕下游的许多兆字节中,我们就可以从磁盘中读取大量片段并以这种方式变得更快。但在现实生活中 Vim 并不知道有多少数据值得一次读取,因为如果我们期望在相当短的距离内找到模式,比如下面三行(同意,这是更期望的情况)那么我们绝对没有理由从磁盘读取大量数据;这将是无用的时间和带宽消耗。由于 Vim 事先不知道一次要读取多少数据,因此它使用了一些权衡,这在您的情况下并不是最佳的。

相反,管道 "cat|.." 勇敢地处理非常大的数据,仅受进程可用内存的限制(理想情况下,一旦找到文件,它就会以不间断模式读取数据并发送到管道)。因为 cat "knows" 需要整个文件内容,没有理由按小页阅读。

因此,虽然 grep 和 cat 吸收的数据量相同,但后者在磁盘上寻找磁道的次数要少得多,从而显着提高效率。

如果我们模式的前缀字符组合在要扫描的文件中非常频繁,我们也可能会体验到基于 Aho–Corasick 字符串匹配算法的 grep 搜索技术的效率优势。