2016-05-29 2 views
3

Ich habe die vollständige documentation für gnu sortiert und online gesucht, aber ich kann nicht finden, was der Standard für die --buffer-size Option ist (die bestimmt, wie viel Systemspeicher das Programm verwendet, wenn es ausgeführt wird). Ich nehme an, dass es auf der Grundlage des gesamten Systemgedächtnisses irgendwie bestimmt wird? (oder vielleicht im Speicher verfügbar zu dem Zeitpunkt, zu dem das Programm ausgeführt wird?). Wie kann ich das feststellen?gnu sort - Standardpuffergröße

update: Ich habe ein wenig experimentiert und es scheint, dass, wenn ich nicht einen bestimmten - Puffer-Größe Wert angeben, endet es mit sehr wenig RAM und damit sehr langsam. Es wäre jedoch schön, besser zu verstehen, was genau dieses Verhalten ausmacht.

Antwort

6

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.

2

auf Englisch Zusammenfassend sind die Standardwerte sind:

von einer realen Datei lesen: Verwenden Sie alle freien Speicher, bis zu 3/4 und nicht weniger als 1/8 des Gesamtspeichers.

(Wenn es ein Verfahren (rusage) Speichergrenze in der Tat nicht sort mehr verwenden, als die Hälfte davon.)

aus einem Rohr Lese: Verwendung eine kleine, festgelegte Menge (einige zehn MB).
Sie werden wahrscheinlich wollen -S.

Strom für GNU coreutils 8.29, Jan 2018.