内存耗尽:对于使用diff的大文件

时间:2013-03-07 05:50:54

标签: diff patch large-files

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

以下是我的表现:

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

但也许是由于文件大小,补丁没有被创建并且出错:

diff: memory exhausted

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

3 个答案:

答案 0 :(得分:16)

最近,当我需要区分两个大文件(每个> 5Gb)时,我也遇到过这种情况。

我尝试使用不同选项的'diff',但即使--speed-large-files也没有效果。其他方法,例如使用xdelta将文件拆分为较小的文件或按this suggestion对文件进行排序也无济于事。我甚至可以使用非常强大的VM(> 72Gb RAM),但仍然出现memory exhausted错误。

我最终通过将以下参数添加到sysctl.confsudo vim /etc/sysctl.conf)来开始工作:

vm.overcommit_memory=1

vm.overcommit_memory有三个值(0,1,2)并设置内核虚拟内存记帐模式。来自proc(5) man page

  

0:启发式过度使用(这是默认值)
  1:总是过度使用,从不检查
  2:经常检查,永远不要过度使用

要确保参数确实已应用,您可以运行

sudo sysctl -p

完成后别忘了更改此参数!

答案 1 :(得分:1)

尝试 sdiff 这是Linux发行版中的预构建工具。

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

将显示要修改的文件。

这对我来说很有效.............

答案 2 :(得分:1)

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