我已阅读全文文档 http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html#sort-invocation对于 gnu sort 并在线搜索,但我找不到 --buffer-size 选项的默认值(它决定程序运行时使用多少系统内存)。我猜它是根据系统总内存以某种方式确定的? (或者也许在程序开始执行时可用的内存上?)。我怎样才能确定这一点?
update:我进行了一些实验,似乎当我没有指定特定的 --buffer-size 值时,它最终会使用很少的内存,因此运行速度非常慢。不过,如果能够更好地理解到底是什么决定了这种行为,那就太好了。
我深入研究了 coreutils sort 源代码并发现了这些函数:default_sort_size http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/sort.c#n1445 and sort_buffer_size http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/sort.c#n1491.
事实证明--buffer-size
(sort_size
在源代码中)不是target缓冲区大小而是maximum缓冲区大小。如果不--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
(i.e. --buffer-size
)(如果已提供)。否则,对于常规文件,它将根据文件大小进行一些粗略计算,并且仅使用sort_size
作为上限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)