有足够多的问题询问如何区分大文件,因为diff无法处理它们。
我想知道为什么GNU diff 无法处理它们。
我做了一个小实验。我比较了两个相同的数据集,就像这样
$ time /usr/bin/diff -u <(cat file1) <(cat file2) > /tmp/memoryhog
^C
real 5m6.478s
user 0m0.540s
sys 0m19.184s
Run Code Online (Sandbox Code Playgroud)
这是 top 在我取消工作的同时显示的内容:
3 PID %MEM VIRT SWAP RES CODE DATA SHR nMaj nDRT S PR NI %CPU COMMAND
19087 30.0 16.0g 9.4g 0.2m 16.0g 2.0m R 20 0.5 /usr/bin/diff -u /dev/fd/63 /dev/fd/62
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,输出是空的:
$ stat -c '%s' /tmp/memoryhog
0
Run Code Online (Sandbox Code Playgroud)
(它们实际上不是文件,而是数据库结果,我忘记跟踪diff当时实际消耗了多少字节- 估计每个管道文件 30-60GiB。)
但是那里发生了什么?
diff 当它甚至不需要跟踪单个字节更改时,是否正在分配大量内存?
我只能假设部分原因是必须跟踪行数,但是分配 16GiB 虚拟内存对于该任务来说似乎有点多!
是什么diff觉得需要那么多的内存?或者只是糟糕的内存处理? …