Grep 在比较两个文件时导致整个系统冻结

Grep 在比较两个文件时导致整个系统冻结

我想要比较两个文件并检查file1中的每一行是否存在file2。我的第一次尝试:grep -v -f file2 file1。这导致了很多语法错误(但没有冻结任何东西)。我很快发现这是因为我需要使用-F如解释的那样这里。所以我运行了grep -Fvf file2 file2,几秒钟后我的整个系统就冻结了几分钟,直到 xorg 完全崩溃。

我拍下了这张冻结的屏幕的照片: 资源管理器

当我终于能够进入 tty2 时,我看到的是这个: 错误

问题:

  1. 系统冻结的原因仅仅是因为内存不足吗,还是还有其他原因?
  2. 为什么 grep 使用~14GB RAM(并且需要更多)来比较两个 250MB 的文件?
  3. 我可以使用工具来限制 grep 可以使用的 RAM,但据我所知,一旦 RAM 达到 x GB,所有这些工具都会终止进程,所以这对我没有帮助。在这种情况下该怎么办?假​​设我们必须使用 grep。

编辑:我已经找到了不使用 grep 的解决方法。但我真的很好奇为什么以及如何会发生这种情况。+14GB RAM 来处理两个 250MB 的文件对我来说似乎很奇怪。我不是寻找如何将我的文件与这个问题进行比较的替代方法。

答案1

  1. 原因肯定是内存不足。

  2. 因为你不是在“比较两个文件”,所以你使用一个 250MB 的文件作为模式对于 grep。Grep 将这些模式编译成确定性有限自动机,并且此 DFA 的表示占用内存。如果你有许多模式(例如 250MB 的模式),它会占用很多空间,因为改造非确定性有限自动机将许多模式对应到 DFA 中可能会导致指数爆炸。

grep可以非常高效地查找一个或多个大型文件中的少数模式。它不用于“比较”文件。如果您尝试将其用于此目的,可能会出错。正如您的情况一样。

复杂性很重要,这就是你要学习 O 符号和所有这些奇特的东西的原因。

  1. 在这种情况下,您应使用适合您情况的程序,而不是使用针对您的问题的空间指数算法的程序。

你说你不想知道替代方案,但因为它涉及一个鲜为人知的工具,所以我还是会告诉你:

如果问题是“file1 的每一行是否也存在于 file2 中,无论顺序如何”,您需要对两个文件进行排序,然后使用comm,它需要排序后的文件,并在 file1 中输出 (1) 行,但不在 file2 中输出,在 file2 中输出 (2) 行,但不在 file1 中输出,并且在两个文件中输出 (3) 行,这取决于您的方便。

相关内容