Antworten:
Ab Coreutils 8.6 (15.10.2010) wird GNU sort
bereits parallel sortiert, um mehrere Prozessoren zu verwenden, sofern verfügbar. Also, es kann in dieser Hinsicht nicht weiter verbessert pigz
oder pbzip2
verbessert werden gzip
oder bzip2
.
Wenn dies sort
nicht der Fall ist, können Sie versuchen, GNU sort
von der neuesten Version von GNU coreutils zu installieren .
Mit der GNU-Sortierung können Sie die Anzahl der Threads mit der --parallel
Option begrenzen .
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
sort -S 50%
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 sort
Programm selbst Teile auf die Festplatte und zurück überträgt. Bei älteren sort
Implementierungen 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.
sort
hat eine -m
Option, 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
.
split
und durchführen merge
und sehen, ob es hilft.
merge(1)
Anwendbarkeit. Verwenden Sie sort -m
.
sort --merge
.
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/shm
erheblichen Verbesserung Ihres Prozesses führen kann, ist die Verwendung des Ordners für die Zuordnung des Arbeitsspeichers für die Verarbeitung von Zwischendateien.
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 (!!!).
LC_ALL=C
genug?
LC_COLLATE
es schon. AFAIK sort
verwendet strcoll
für den Vergleich und die Manpage sagt, dass das Verhalten vonLC_COLLATE
#! /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