Bisakah saya memparalelkan pengurutan?

13

Misalnya untuk bzipada pbzip , versi paralel dari bzip. Apakah ada alat paralelisasi untuk sortmeningkatkan kinerja?

miku
sumber

Jawaban:

12

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.

Stéphane Chazelas
sumber
2
sort --stable memberikan peningkatan kinerja 15%, setidaknya dalam beban kerja pengujian saya.
jrw32982 mendukung Monica
8

Satu hal yang selalu membantu saya dengan sort adalah memberikannya memori sebanyak mungkin, sehingga mengurangi pertukaran, misalnya:

sort -S 20G
Benroth
sumber
4
Terima kasih, ini adalah trik yang saya gunakan akhir-akhir ini juga - biarkan saja gunakan setengah dari RAM, jika diperlukan:sort -S 50%
miku
6

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.

Warren Young
sumber
Terima kasih atas jawaban anda. Saya akan melakukan beberapa tolok ukur dengan splitdan mergedan melihat apakah itu membantu.
miku
@miku: Saya tidak melihat ada yang bisa merge(1)diterapkan di sini. Gunakan sort -m.
Warren Young
1
maaf atas kelemahan saya, maksud saya sort --merge.
miku
1
Jika Anda membagi file dan mengurutkan bagian-bagiannya, Anda masih harus mengurutkan semuanya saat Anda mengembalikannya, bukan? Bagaimana itu akan lebih cepat?
terdon
2
Ini adalah varian pada algoritma pengurutan gabungan , salah satu metode pengurutan tercepat yang tersedia.
Warren Young
3

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.

Saullo GP Castro
sumber
3
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 (!!!)

mt_
sumber
Terima kasih, tetapi tidakkah LC_ALL=Cakan cukup?
miku
Saya kira begitu ... mungkin LC_COLLATEsudah cukup. AFAIK sortmenggunakan strcolluntuk perbandingan dan halaman manual mengatakan perilaku tergantung padaLC_COLLATE
mt_
0
#! /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

amicos
sumber
1
Hai! Jawaban ini dapat ditingkatkan dengan menjelaskan apa yang seharusnya dilakukan, daripada menjadi hanya dump kode (juga, jika telah menjadi benchmark lebih cepat daripada GNU mengurutkan pada beberapa input, itu akan menarik untuk diketahui!).
Dhag