Yanıtlar:
Coreutils 8.6 (2010-10-15) itibariyle, GNU sort
hali hazırda birkaç işlemciyi kullanmak için paralel olarak sıralamaktadır. Bu nedenle, pigz
ya da gibi ya da pbzip2
geliştirmek bu konuda daha fazla geliştirilemez .gzip
bzip2
Sizin sort
paralel değilse sort
, GNU coreutils'in en son sürümünden GNU'yu kurmayı deneyebilirsiniz .
GNU sıralama ile, --parallel
seçenek sayısı ile iş parçacığı sayısını sınırlayabilirsiniz .
Dosyanız yeterince büyükse, ayırma işlemi, ayrılan sanal bellek çok büyük büyüdüğü için veya sort
programın kendisi diskleri geri ve geri takas ettiği için disk değiştirmeye neden olur. Eski sort
uygulamalarda büyük dosyaları sıralamanın tek yolu olduğundan, daha eski uygulamaların bu "disk arabellek üzerinden sıralama" tür davranışa sahip olma olasılığı daha yüksektir.
sort
-m
burada size yardımcı olabilecek bir seçenek var. Dosyayı parçalara ayırmak daha hızlı olabilir - diyelim ki split -l
- bağımsız olarak sıralayın, sonra tekrar birleştirin.
Sonra tekrar, bu tam olarak "disk arabellek yoluyla sıralama" yaptığı şey olabilir. Yardım edip etmediğini bulmanın tek yolu, testinize göre karşılaştırmaktır. Kritik parametre, verdiğiniz satır sayısı olacaktır split -l
.
split
ve merge
ve yardımcı olmadığını görmek.
merge(1)
uygulanabilirliği olduğunu görmüyorum . Kullanın sort -m
.
sort --merge
.
sort -n
Seçilen tüm sütunlarda sayısal gösterimler (kayan nokta veya tamsayı) gerektiren çok önemli bir kazanç elde ettim , bilimsel gösterim olmadan.
İşleminizde büyük bir gelişme sağlayabilecek bir diğer olasılık, /dev/shm
ara dosyalarla uğraşmak için bellek eşlemeli klasörü kullanmaktır .
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null
Genellikle Linux sıralama, Unicode eşitlik kurallarına uymak için bazı şık şeyler yapar ...
1.4GB'lık bir dosya için makinemdeki fark 20s ve 400s (!!!)
LC_ALL=C
yeterli olmaz mıydı ?
LC_COLLATE
zaten yeterli. AFAIK karşılaştırma için sort
kullanır strcoll
ve manpage davranışın bağlı olduğunu söylüyorLC_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
dosya bölünmüş ve sıralama, sıralama hızını artıracaktır