Ich ging graben durch die Coreutils Quellcode und fand diese Funktionen: default_sort_size
und sort_buffer_size
.
Es stellt sich heraus, dass --buffer-size
(sort_size
im Quellcode) ist nicht das Ziel Puffergröße, sondern die maximale Puffergröße. Wenn kein Wert --buffer-size
angegeben ist, wird die default_sort_size
-Funktion verwendet, um eine sichere maximale Puffergröße zu bestimmen. Es basiert auf Ressourcenbeschränkungen, verfügbarem Speicher und Gesamtspeicher. Eine Zusammenfassung der Funktion ist wie folgt:
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);
Die andere Funktion, sort_buffer_size
, verwendet wird, genau zu bestimmen, wie viel Speicher für die angegebenen Eingabedateien zuzuordnen. Eine Zusammenfassung der Funktion ist wie folgt:
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;
Möglicherweise ist der wichtigste Punkt der sort_buffer_size
Funktion ist, dass, wenn Sie Daten von STDIN oder einem Rohr Sortierung, wird es automatisch auf sort_size
Standard (dh --buffer-size
), wenn es wurde bereitgestellt. Andernfalls werden für normale Dateien einige grobe Berechnungen basierend auf den Dateigrößen durchgeführt und nur als obere Grenze verwendet.