gnu sort - размер буфера по умолчанию

Я прочитал полную документацию по gnu sort и поиск в Интернете, но я не могу найти значение по умолчанию для параметра --buffer-size (который определяет, сколько системной памяти использует программа при запуске). Я предполагаю, что это как-то определяется на основе общей системной памяти? (или, возможно, в памяти, доступной в момент начала выполнения программы?). Как я могу это определить?

обновление: я немного поэкспериментировал, и кажется, что когда я не указываю конкретное значение --buffer-size, в конечном итоге он использует очень мало оперативной памяти и, следовательно, работает очень медленно. Было бы неплохо, однако, лучше понять, что именно определяет это поведение.


person Michael Ohlrogge    schedule 29.05.2016    source источник


Ответы (2)


Я порылся в исходном коде сортировки 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 в качестве верхнего предела.

person Mr. Llama    schedule 06.12.2016

Подводя итог на английском языке, значения по умолчанию:

Чтение из реального файла: используйте всю свободную память, до 3/4 и не менее 1/8 всей памяти.

(Если действует ограничение памяти процесса (rusage), сортировка не будет использовать более половины этого объема.)

Чтение из конвейера: используйте небольшой фиксированный объем (десятки МБ).
Вероятно, вам понадобится -S.

Актуально для GNU coreutils 8.29, январь 2018.

person Doctor J    schedule 04.01.2018