小编nyo*_*yov的帖子

为什么 GNU diff 这样的内存猪?

有足够多的问题询问如何区分大文件,因为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觉得需要那么多的内存?或者只是糟糕的内存处理? …

memory linux diff gnu

7
推荐指数
1
解决办法
319
查看次数

标签 统计

diff ×1

gnu ×1

linux ×1

memory ×1