並べ替えを並列化できますか?


13

例えばためbzipありpbzip、並列バージョンbzipsortパフォーマンスを改善するためのそのような並列化ツールはありますか?

回答:


12

coreutils 8.6(2010-10-15)の時点で、GNU sortは利用可能な場合は複数のプロセッサを利用するためにすでに並列にソートしています。だから、それは更なるようにその点では改善できないpigzか、pbzip2改善しますgzipbzip2

sort並行していない場合はsortGNU coreutilsの最新バージョンからGNUを試してインストールできます。

GNUソートでは、--parallelオプションを使用してスレッドの数を制限できます。


2
sort --stableは、少なくとも私のテストワークロードでは、パフォーマンスを15%向上させます。
jrw32982はモニカをサポートします

8

ソートで常に最も役立つ1つのことは、スワップを減らすために、可能な限り多くのメモリを与えることです。例えば:

sort -S 20G

4
おかげで、これはあまりにも、最近私が使うトリックです-ちょうど必要な場合は、ソート、半分のRAMを使用してみましょう:sort -S 50%
ミク

6

ファイルが十分に大きい場合、割り当てられた仮想メモリが大きくなりすぎているか、sortプログラム自体がチャンクをディスクにスワップして戻しているため、ソートによってディスクのスワップが発生します。古いsort実装では、この「ディスクバッファを介したソート」のような動作が発生する可能性が高くなります。これは、昔は大きなファイルをソートする唯一の方法だったからです。

sort持っている-mここであなたを助けるかもしれないオプションを選択します。ファイルをチャンクに分割して(たとえば、)split -l個別にソートしてから、それらをマージして戻す方が速い場合があります。

繰り返しになりますが、これはまさに「ディスクバッファによるソート」が行うことです。役立つかどうかを確認する唯一の方法は、特定のテスト負荷でベンチマークすることです。重要なパラメータは、指定した行数ですsplit -l


ご回答有難うございます。私はいくつかのベンチマークを行いますsplitmerge、それは場合に役立ちます参照してください。
ミク

@miku:merge(1)ここに適用性があるとは思えません。を使用しsort -mます。
ウォーレンヤング

1
私の弛緩のために申し訳ありません、私は意味したsort --merge
ミク

1
ファイルを分割してピースをソートする場合、元に戻すときに全体をソートする必要がありますか?どのように速くなりますか?
テルドン

2
これは、利用可能な最速のソート方法の1つであるマージソートアルゴリズムの変形です。
ウォーレンヤング

3

を使用するとsort -n、選択したすべての列に数値(浮動小数点または整数)が必要で、科学表記法を使用せずに非常に大きなゲインが得られました。

プロセスに大きな改善をもたらす可能性のあるもう1つの可能性は、メモリマップフォルダー/dev/shmを使用して中間ファイルを処理することです。


3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

通常、Linuxの並べ替えは、Unicodeの等式規則に準拠するためにいくつかの気の利いたことを行います...ロケールをCに変更すると、バイトのみに切り替わります...

1.4GBファイルの場合、私のマシンの違いは20秒と400秒です(!!!)


ありがとう、LC_ALL=Cでも十分ではないでしょうか?
ミク

私はそう思う...多分LC_COLLATEすでに十分です。AFAIK sortstrcoll比較に使用しており、マンページには、動作は次のように依存していると書かれていますLC_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

ファイルが分割されて並べ替えられると、並べ替えの速度が上がります


1
こんにちは!この回答は、コードダンプだけでなく、何をするつもりかを説明することで改善できます(また、入力に関してGNUソートよりも高速であることがベンチマークされている場合は、興味深いことです!)。
ダグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.