Sıralamayı paralelleştirebilir miyim?


13

Örneğin , paralel bir sürümü olan pbzipbzip var . Performansı artırmak için böyle bir paralelleştirme aracı var mı ?bzipsort

Yanıtlar:


12

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 .


2
sort --stable, en azından test iş yükümde% 15 performans artışı sağlıyor.
jrw32982 Monica

8

Bana her zaman sıralamada en çok yardımcı olan tek şey, değiştirmeyi azaltmak için mümkün olduğunca fazla bellek vermektir, örneğin:

sort -S 20G

4
Teşekkürler, bu son zamanlarda da kullandığım bir hile - sadece gerekirse RAM'in yarısını kullanmanıza izin verin:sort -S 50%
miku

6

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.


Cevabınız için teşekkürler. Ben bazı kriterler yürütecek splitve mergeve yardımcı olmadığını görmek.
miku

@miku: Bunun merge(1)uygulanabilirliği olduğunu görmüyorum . Kullanın sort -m.
Warren Young

1
Gevşekliğim için özür dilerim sort --merge.
miku

1
Dosyayı bölüp parçaları sıralarsanız, yeniden bir araya getirdiğinizde her şeyi sıralamanız gerekir mi? Bu nasıl daha hızlı olacak?
terdon

2
Bu, mevcut en hızlı sıralama yöntemlerinden biri olan birleştirme sıralama algoritmasında bir varyanttır .
Warren Young

3

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 .


3
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 (!!!)


Teşekkürler, ama LC_ALL=Cyeterli olmaz mıydı ?
miku

Sanırım ... belki LC_COLLATEzaten yeterli. AFAIK karşılaştırma için sortkullanır strcollve manpage davranışın bağlı olduğunu söylüyorLC_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

dosya bölünmüş ve sıralama, sıralama hızını artıracaktır


1
Selam! Bu cevap, sadece bir kod dökümü olmaktan ziyade ne yapılması gerektiğini açıklayarak geliştirilebilir (ayrıca, bazı girdilerde GNU türünden daha hızlı olarak karşılaştırılmışsa, bunu bilmek ilginç olacaktır!).
dhag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.