12

我正在尝试使用两个大型文件夹(~7GB)创建一个补丁。

这是我的做法:

$ diff -Naurbw . ../other-folder > file.patch

但可能由于文件大小的原因,没有创建补丁并给出错误:

diff: memory exhausted

我尝试使空间超过 15 GB,但问题仍然存在。有人可以帮我解决我应该使用的标志吗?

4

3 回答 3

18

最近,当我需要区分两个大文件(每个文件 > 5Gb)时,我也遇到了这个问题。

我尝试使用具有不同选项的“差异”,但即使--speed-large-files没有效果。其他方法(例如将文件拆分为较小的xdelta文件、按照此建议使用或排序文件)也无济于事。我什至得到了一个非常强大的虚拟机(> 72Gb RAM),但仍然出现此memory exhausted错误。

我终于通过在sysctl.conf( sudo vim /etc/sysctl.conf) 中添加以下参数来开始工作:

vm.overcommit_memory=1

vm.overcommit_memory具有三个值(0,1,2)并设置内核虚拟内存记帐模式。从proc(5) 手册页

0:启发式过度使用(这是默认设置)
1:总是过度使用,从不检查
2:总是检查,从不过度使用

为确保确实应用了该参数,您可以运行

sudo sysctl -p

完成后不要忘记将这个参数改回来!

于 2015-02-16T10:19:31.997 回答
2

bsdiff速度慢且需要大内存,xdelta为大文件创建大增量。

为大文件尝试 HDiffPatch:https ://github.com/sisong/HDiffPatch

  • 支持大型二进制文件或目录之间的差异;
  • 可以运行在:Windows、macOS、Linux、Android
  • diff 和 patch 都支持使用限制内存运行;

使用示例:

  • 创建补丁:hdiffz -s-256 [-c-lzma2] old_path new_path out_delta_file
  • 应用补丁:hpatchz old_path delta_file out_new_path
于 2020-06-25T02:23:05.947 回答
-2

试试sdiff。它是某些 Linux 发行版中的预构建工具。

sdiff a.txt b.txt --output=c.txt

将显示要修改的文件。

这对我来说非常有效。

于 2018-05-31T08:35:28.120 回答