【问题标题】:gnu sort - default buffer sizegnu sort - 默认缓冲区大小
【发布时间】:2016-05-29 19:52:39
【问题描述】:

我已阅读完整的documentation 以进行 gnu 排序并在线搜索,但我找不到 --buffer-size 选项的默认值(它决定了程序运行时使用的系统内存量)。我猜它是基于总系统内存以某种方式确定的? (或者可能在程序开始执行时可用的内存上?)。我如何确定这一点?

更新:我做了一些实验,似乎当我没有指定特定的 --buffer-size 值时,它最终会使用非常少的内存,因此运行速度非常慢。不过,最好能更好地了解究竟是什么决定了这种行为。

【问题讨论】:

    标签: gnu-sort


    【解决方案1】:

    我翻遍了coreutils排序源代码,发现了这些函数:default_sort_sizesort_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作为上限。

    【讨论】:

      【解决方案2】:

      用英文总结一下,默认是:

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

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

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

      当前为 GNU coreutils 8.29,2018 年 1 月。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-03
        • 2021-09-18
        • 1970-01-01
        • 2012-05-08
        • 2013-08-14
        • 2015-06-07
        • 2012-04-05
        • 2016-09-21
        相关资源
        最近更新 更多