Jawaban:
Pada coreutils 8.6 (2010-10-15), GNU sortsudah memilah secara paralel untuk menggunakan beberapa prosesor jika tersedia. Jadi, tidak bisa lebih ditingkatkan dalam hal suka pigzatau pbzip2perbaiki gzipatau bzip2.
Jika Anda sorttidak paralel, Anda dapat mencoba dan menginstal GNU sortdari versi terbaru GNU coreutils .
Dengan penyortiran GNU, Anda dapat membatasi jumlah utas dengan --parallelopsi.
Satu hal yang selalu membantu saya dengan sort adalah memberikannya memori sebanyak mungkin, sehingga mengurangi pertukaran, misalnya:
sort -S 20G
sort -S 50%
Jika file Anda cukup besar, pengurutan akan menyebabkan swap disk, baik karena memori virtual yang dialokasikan tumbuh terlalu besar, atau karena sortprogram itu sendiri menukar potongan ke disk dan kembali. sortImplementasi yang lebih lama lebih cenderung memiliki perilaku semacam "sort via disk buffer" ini, karena itu adalah satu-satunya cara untuk mengurutkan file besar di masa lalu.
sortmemiliki -mopsi yang dapat membantu Anda di sini. Mungkin lebih cepat untuk membagi file menjadi potongan - katakan dengan split -l- mengurutkannya secara mandiri, kemudian menggabungkannya kembali.
Kemudian lagi, mungkin inilah yang dilakukan "sortir melalui disk buffer". Satu-satunya cara untuk mengetahui apakah itu membantu adalah dengan membandingkannya pada beban pengujian khusus Anda. Parameter kritis adalah jumlah baris yang Anda berikan split -l.
splitdan mergedan melihat apakah itu membantu.
merge(1)diterapkan di sini. Gunakan sort -m.
sort --merge.
Saya mendapatkan penguatan yang sangat signifikan sort -n, yang membutuhkan nilai numerik (float atau integer) di semua kolom yang dipilih, tanpa notasi ilmiah.
Kemungkinan lain yang mungkin membawa perbaikan besar dalam proses Anda adalah menggunakan folder yang dipetakan memori /dev/shmuntuk menangani file perantara.
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null
Biasanya Linux semacam melakukan beberapa hal bagus untuk mematuhi aturan kesetaraan Unicode ... jika Anda mengubah lokal ke C itu beralih ke byte hanya ...
Untuk file 1.4GB perbedaan pada mesin saya adalah 20s vs 400s (!!!)
LC_ALL=Cakan cukup?
LC_COLLATEsudah cukup. AFAIK sortmenggunakan strcolluntuk perbandingan dan halaman manual mengatakan perilaku tergantung padaLC_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
file dipecah dan mengurutkannya akan meningkatkan kecepatan penyortiran