Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 为什么vim搜索比“搜索”慢得多;cat文件名“grep targetText”;?_Search_Vim_String Matching - Fatal编程技术网

Search 为什么vim搜索比“搜索”慢得多;cat文件名“grep targetText”;?

Search 为什么vim搜索比“搜索”慢得多;cat文件名“grep targetText”;?,search,vim,string-matching,Search,Vim,String Matching,我有一个名为test.txt的1.4 GB文本文件,我想在该文件中搜索一个字符串 我想知道为什么vim search(vim test.txt,然后键入/targetText来搜索字符串)的执行速度比cat test.txt | grep targetText慢得多 在我的机器上,vim search大约需要几分钟来完成搜索,而cat test.txt | grep targetText大约需要几秒钟来完成搜索 Vim是一名编辑。它将尝试将文件加载到内存中,然后您可以对其进行编辑。Vim可以编辑

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

我想知道为什么vim search(vim test.txt,然后键入
/targetText
来搜索字符串)的执行速度比
cat test.txt | grep targetText
慢得多


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

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

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


顺便说一句,您只需执行
grep搜索文件
,而无需使用cat。

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

另一方面,管道“cat |…”勇敢地处理非常大的数据块,这些数据块仅受进程可用内存的限制(理想情况下,一旦找到文件,它将以不间断模式读取数据并发送到管道)。因为cat“知道”需要整个文件内容,所以没有理由用小页面来阅读

因此,尽管grep和cat吸收的数据量相同,但后者在磁盘上寻找磁道的次数要少得多,从而大大提高了效率


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

来自
:他grep
:“Vim有两种方法来查找模式匹配:内部和外部。(…)内部方法会比较慢,因为文件会被读入内存。“
/targetText
grep targetText
有着截然不同的用途。@romainl两个不同的“搜索”命令除了搜索之外还有什么截然不同的用途?@syam,
/
更适合于您不想了解所有匹配项的情况,而
:grep
和朋友更适合于您需要查看所有匹配项的情况。