Yanıtlar:
Coreutils 8.6 (2010-10-15) itibariyle, GNU sorthali hazırda birkaç işlemciyi kullanmak için paralel olarak sıralamaktadır. Bu nedenle, pigzya da gibi ya da pbzip2geliştirmek bu konuda daha fazla geliştirilemez .gzipbzip2
Sizin sortparalel değilse sort, GNU coreutils'in en son sürümünden GNU'yu kurmayı deneyebilirsiniz .
GNU sıralama ile, --parallelseç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 sortprogramın kendisi diskleri geri ve geri takas ettiği için disk değiştirmeye neden olur. Eski sortuygulamalarda 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-mburada 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.
splitve mergeve yardımcı olmadığını görmek.
merge(1)uygulanabilirliği olduğunu görmüyorum . Kullanın sort -m.
sort --merge.
sort -nSeç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/shmara 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=Cyeterli olmaz mıydı ?
LC_COLLATEzaten yeterli. AFAIK karşılaştırma için sortkullanır strcollve 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