Jawaban:
Pada coreutils 8.6 (2010-10-15), GNU sort
sudah memilah secara paralel untuk menggunakan beberapa prosesor jika tersedia. Jadi, tidak bisa lebih ditingkatkan dalam hal suka pigz
atau pbzip2
perbaiki gzip
atau bzip2
.
Jika Anda sort
tidak paralel, Anda dapat mencoba dan menginstal GNU sort
dari versi terbaru GNU coreutils .
Dengan penyortiran GNU, Anda dapat membatasi jumlah utas dengan --parallel
opsi.
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 sort
program itu sendiri menukar potongan ke disk dan kembali. sort
Implementasi 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.
sort
memiliki -m
opsi 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
.
split
dan merge
dan 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/shm
untuk 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=C
akan cukup?
LC_COLLATE
sudah cukup. AFAIK sort
menggunakan strcoll
untuk 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