2016-05-29 4 views
3

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

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

ответ

6

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

2

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

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

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

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

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

Смежные вопросы