gnu sort - 默认缓冲区大小
gnu sort - default buffer size
我已经阅读了 gnu sort 的完整 documentation 并在网上进行了搜索,但是我找不到 --buffer-size 选项的默认值(它决定程序运行时使用的系统内存量) ).我猜它是根据系统总内存以某种方式确定的? (或者可能在程序开始执行时可用的内存上?)。我该如何确定?
更新: 我做了一些实验,似乎当我没有指定特定的 --buffer-size 值时,它最终使用的内存非常少,并且因此进展非常缓慢。如果能更好地理解究竟是什么决定了这种行为,那就太好了。
我仔细研究了 coreutils 排序源代码,发现了这些函数:default_sort_size
and 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
作为上限。
用英文总结一下,默认是:
从真实文件读取:
使用所有可用内存,最多为总内存的 3/4 且不少于 1/8。
(如果存在有效的进程(使用)内存限制,排序将不会使用超过一半的内存。)
从管道读取:
使用较小的固定数量(数十 MB)。
您可能需要 -S
.
当前 GNU coreutils 8.29,2018 年 1 月。
我已经阅读了 gnu sort 的完整 documentation 并在网上进行了搜索,但是我找不到 --buffer-size 选项的默认值(它决定程序运行时使用的系统内存量) ).我猜它是根据系统总内存以某种方式确定的? (或者可能在程序开始执行时可用的内存上?)。我该如何确定?
更新: 我做了一些实验,似乎当我没有指定特定的 --buffer-size 值时,它最终使用的内存非常少,并且因此进展非常缓慢。如果能更好地理解究竟是什么决定了这种行为,那就太好了。
我仔细研究了 coreutils 排序源代码,发现了这些函数:default_sort_size
and 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
作为上限。
用英文总结一下,默认是:
从真实文件读取: 使用所有可用内存,最多为总内存的 3/4 且不少于 1/8。
(如果存在有效的进程(使用)内存限制,排序将不会使用超过一半的内存。)
从管道读取:
使用较小的固定数量(数十 MB)。
您可能需要 -S
.
当前 GNU coreutils 8.29,2018 年 1 月。