Kann ich sortieren parallelisieren?

13

Zum Beispiel bzipgibt es pbzip , eine parallele Version von bzip. Gibt es solche Tools für sortdie Parallelisierung , um die Leistung zu verbessern?

Miku
quelle

Antworten:

12

Ab Coreutils 8.6 (15.10.2010) wird GNU sortbereits parallel sortiert, um mehrere Prozessoren zu verwenden, sofern verfügbar. Also, es kann in dieser Hinsicht nicht weiter verbessert pigzoder pbzip2verbessert werden gzipoder bzip2.

Wenn dies sortnicht der Fall ist, können Sie versuchen, GNU sortvon der neuesten Version von GNU coreutils zu installieren .

Mit der GNU-Sortierung können Sie die Anzahl der Threads mit der --parallelOption begrenzen .

Stéphane Chazelas
quelle
2
sort --stable bietet eine Leistungssteigerung von 15%, zumindest bei meiner Testauslastung.
jrw32982 unterstützt Monica
8

Das einzige, was mir beim Sortieren immer am meisten hilft, ist, ihm so viel Speicher wie möglich zu geben, um das Vertauschen zu verringern, z.

sort -S 20G
benroth
quelle
4
Danke, das ist ein Trick, den ich in letzter Zeit auch benutze - lass sort nur die Hälfte des Arbeitsspeichers verwenden, wenn nötig:sort -S 50%
miku
6

Wenn Ihre Datei groß genug ist, führt das Sortieren zu einem Plattenaustausch, entweder weil der zugewiesene virtuelle Speicher zu groß wird oder weil das sortProgramm selbst Teile auf die Festplatte und zurück überträgt. Bei älteren sortImplementierungen ist es wahrscheinlicher, dass diese Art des Sortierens über den Festplattenpuffer erfolgt, da dies früher die einzige Möglichkeit war, große Dateien zu sortieren.

sorthat eine -mOption, die Ihnen hier helfen kann. Es ist möglicherweise schneller, die Datei in Blöcke aufzuteilen - sagen wir mit split -l- sie unabhängig voneinander zu sortieren und sie dann wieder zusammenzuführen.

Andererseits kann es sein, dass dies genau das ist, was "Sortieren über Plattenpuffer" tut. Die einzige Möglichkeit, herauszufinden, ob dies hilfreich ist, besteht darin, es an Ihrer speziellen Testlast zu messen. Der kritische Parameter ist die Zeilenzahl, die Sie vergeben split -l.

Warren Young
quelle
Danke für deine Antwort. Ich werde einige Benchmarks mit splitund durchführen mergeund sehen, ob es hilft.
Miku
@miku: Ich sehe hier keine merge(1)Anwendbarkeit. Verwenden Sie sort -m.
Warren Young
1
Entschuldigung für meine Nachlässigkeit, meinte ich sort --merge.
Miku
1
Wenn Sie die Datei aufteilen und die Teile sortieren, müssen Sie trotzdem das Ganze sortieren, wenn Sie es wieder zusammensetzen, oder? Wie wird das schneller sein?
Terdon
2
Dies ist eine Variante des Merge- Sortier-Algorithmus, einer der schnellsten verfügbaren Sortiermethoden.
Warren Young
3

Ich hatte einen sehr signifikanten Gewinn mit sort -n, der numerische Werte (float oder integer) in allen ausgewählten Spalten ohne wissenschaftliche Notation erfordert.

Eine weitere Möglichkeit, die zu einer /dev/shmerheblichen Verbesserung Ihres Prozesses führen kann, ist die Verwendung des Ordners für die Zuordnung des Arbeitsspeichers für die Verarbeitung von Zwischendateien.

Saullo GP Castro
quelle
3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

Normalerweise erledigt die Linux-Sortierung einige raffinierte Aufgaben, um den Unicode-Gleichheitsregeln zu entsprechen. Wenn Sie das Gebietsschema in C ändern, wird nur auf Byte umgeschaltet.

Für eine 1,4-GB-Datei beträgt der Unterschied zwischen 20 und 400 Sekunden (!!!).

mt_
quelle
Danke, aber wäre das nicht LC_ALL=Cgenug?
Miku
Ich denke schon ... vielleicht reicht LC_COLLATEes schon. AFAIK sortverwendet strcollfür den Vergleich und die Manpage sagt, dass das Verhalten vonLC_COLLATE
mt_
0
#! /bin/sh
#config MAX_LINES_PER_CHUNK based on file length
MAX_LINES_PER_CHUNK=1000 
ORIGINAL_FILE=inputfile.txt
SORTED_FILE=outputfile.txt
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted

 #Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
rm -f $SORTED_FILE

#Splitting $ORIGINAL_FILE into chunks ...
split -l $MAX_LINES_PER_CHUNK $ORIGINAL_FILE $CHUNK_FILE_PREFIX

for file in $CHUNK_FILE_PREFIX*
do
    sort -n -t , -k 1,1 $file > $file.sorted &
done
wait

#echo "**********SORTED CHUNK FILES*********"
#echo $SORTED_CHUNK_FILES
#Merging chunks to $SORTED_FILE ...
sort  -mn $SORTED_CHUNK_FILES > $SORTED_FILE

#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null

Datei wird geteilt und sortiert, wodurch die Sortiergeschwindigkeit erhöht wird

Amicos
quelle
1
Hallo! Diese Antwort könnte verbessert werden, indem erklärt wird, was damit gemeint ist, anstatt nur ein Code-Dump zu sein (auch wenn es bei einigen Eingaben als schneller als GNU-Sortierung bewertet wurde, wäre das interessant zu wissen!).
Dhag