gnu sort - 默认缓冲区大小

Mic*_*gge 5 gnu-sort

我已经阅读了gnu sort 的完整文档并在线搜索但是我找不到--buffer-size选项的默认值(它决定了程序在运行时使用的系统内存量).我猜它是基于总系统内存以某种方式确定的?(或者在程序开始执行时可用的内存?).我怎么能确定这个?

更新:我已经尝试了一下,似乎当我没有指定一个特定的--buffer-size值时,它最终使用非常少的ram,因此进展非常缓慢.虽然更好地了解究竟是什么决定了这种行为,但这会很好.

Mr.*_*ama 9

我去挖掘coreutils排序源代码并找到了这些函数:default_sort_size和sort_buffer_size.

事实证明--buffer-size(sort_size在源代码中)不是目标缓冲区大小,而是最大缓冲区大小.如果未--buffer-size指定任何值,default_sort_size则使用该函数确定安全的最大缓冲区大小.它基于资源限制,可用内存和总内存来执行此操作.功能概要如下:

size = MIN(SIZE_MAX, resource_limit) / 2;
mem  = MAX(available_memory, total_memory / 8);

if ( size > total_memory * 0.75 )
    size = total * 0.75;

buffer_max = MIN(mem, size);
buffer_max = MAX(buffer, MIN_SORT_SIZE);
Run Code Online (Sandbox Code Playgroud)

另一个函数sort_buffer_size用于确定为给定输入文件分配多少内存.功能概要如下:

if (sort_size is set)
    size_bound = sort_size;
else
    size_bound = default_sort_size();

buffer_size = line_bytes + 2;

for each input_file
    if (input_file is regular)
        file_size = input_file_size;
    else
        if (sort_size is set)
            return sort_size;
        else
            file_size = guess;

    worst_case = file_size * worst_case_per_input_byte + 1;

    if (worst_case overflows || size + worst_case >= size_bound)
        return size_bound;
    else
        size += worst_case;

return size;
Run Code Online (Sandbox Code Playgroud)

可能这个sort_buffer_size函数最重要的一点是,如果你从STDIN或管道中对数据进行排序,它将自动默认为sort_size(即--buffer-size)它是否被提供.否则,对于常规文件,它将根据文件大小进行一些粗略计算,并仅用sort_size作上限.


Doc*_*r J 5

用英语总结,默认值为:

从真实文件读取: 使用所有可用内存,最多3/4,且不少于总内存的1/8。

(如果存在有效的进程(原始)内存限制,则排序将不会使用超过一半的内存。)

从管道读取: 使用少量的固定量(数十MB)。
您可能会想要-S。

当前的GNU的coreutils 8.29,扬2018