在linux中获取两个文件之间差异的有效方法?

在linux中获取两个文件之间差异的有效方法?

我一直试图找出两个巨大的差异。TXTLinux 中的文件(每个 > 6Gb)。我已经尝试了 的所有变体diff,但问题是该过程很快就中止并以“内存耗尽”结束。

我想要得到的是 file1 和 file 2 之间的确切区别:

文件1。

aaa
bbb

文件2。

bbb

差异(文件1,文件2):

 aaa

任何建议都应考虑要比较的文件的巨大大小(大约 6Gb)和有限的可用内存。非常感谢

答案1

由于您的问题错过了重要信息:

  • 您对“所有差异变体”有何理解?

  • 您想要的文件大小是多少?文件有多少行?

回答你的问题的唯一方法是提供大量背景信息。

共有三种基本diff实现:

  • 原本的UNIX 差异基于 Harold Stone 的算法。这通常与diffh大文件的简单差异一起出现,并且bdiff前端diff调用diff两个文件的分段部分。这是最古老的 diff 实现,并且这群 diff 实现的高度可移植版本是 schilytools 的一部分。

  • 该计划乌迪夫来自 schilytools。这个程序已有近 40 年的历史。

  • GNU 差异大约是一个实现。 30岁。

UNIX 差异

是 20 世纪 70 年代初期的版本,是为内存非常有限的小型机器编写的。它仍然需要分配的 RAM,通常为 5*sizeof(int) * sum_of_lines。

Stone 算法在插入或删除后搜索最佳重新同步匹配,这会消耗与文件中行总和的平方成正比的 CPU 时间。这将最近硬件上的典型可用性限制为每个文件几兆字节,直到比较操作花费太多时间。

bdiff是一个前端diff,自动将文件分割成块,diff与块一起运行,最后合并差异输出。如果差异跨越文件分割的位置,则生成的 diff 输出不再是最佳的。bdiff最初是SCCS在 20 世纪 70 年代末开发的,旨在加快运行速度。

diffh是一个单独的程序,使用大约CPU时间。与文件大小成正比,但对于重新同步却非常不热心。

乌迪夫

该程序最初编写于 1982 年。在大多数情况下(如果称为fdiff),它生成的输出与 UNIX diff 的输出相同,但重新同步并不总是像原始 diff 那样有效。它消耗的内存与原始 UNIX diff 一样多,但消耗的 CPU 时间仅与文件大小成线性比例。

GNU 差异

尝试提供与原始 UNIX diff 相同的重新同步质量,但它消耗的 RAM 比两个文件大小的总和还要多。这使得 GNU diff 成为内存猪,因为它阻止它对大文件有用,即使 CPU 时间消耗仅随文件大小线性增加,这使得 GNU diff 成为几兆字节的中等大小文件的最佳选择。

所有这些程序的最新版本都没有行长度限制。

对于典型的文件大小,udiff(以及它的姐妹fdifffsdiff)是最快的 diff 实现。由于它不会尝试合并两个文件(如果它们大于 64 MB),因此udiff对于大文件很有用,并且它似乎是解决您的问题的最佳选择。

我建议您从以下位置下载最新版本的 schilytools:

http://sourceforge.net/projects/schilytools/files/

编译、安装然后运行:

fdiff file1 file2

相关内容