我翻遍了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);
另一个函数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;
sort_buffer_size 函数最重要的一点可能是,如果您从 STDIN 或管道中排序数据,如果提供了它,它将自动默认为 sort_size(即--buffer-size)。否则,对于常规文件,它会根据文件大小进行一些粗略的计算,并且只使用sort_size作为上限。