Sort --parallelは並列化していません


10

私は、sort -uを使用してegrepを使用してファイルからプルされた一連の行を一意にしてから、それらをカウントしようとしています。行の約10%(アルファベット[ATCG]からすべて100文字)が重複しています。2つのファイルがあり、それぞれ約3ギグで、50%は関連性がないため、おそらく3億行になります。

LC_ALL=C  grep -E  <files> |  sort --parallel=24  -u | wc -m

LC_ALL = Cと-xを使用してgrepを高速化する場合、最も遅い部分がソートです。マニュアルページを読んだ結果、-parallel = nになりましたが、実験を行ってもまったく改善は見られませんでした。topを少し掘り下げたところ、-parallel = 24を使用しても、並べ替えプロセスは一度に1つのプロセッサでしか実行されないことがわかりました。

6つのコアと2つのスレッド/コアを備えた4つのチップがあり、合計48個の論理プロセッサーを提供します。/ proc / cpuinfoが長すぎるため、lscpuを参照してください。

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                48
On-line CPU(s) list:   0-47
Thread(s) per core:    2
Core(s) per socket:    6
Socket(s):             4
NUMA node(s):          8
Vendor ID:             AuthenticAMD
CPU family:            21
Model:                 1
Stepping:              2
CPU MHz:               1400.000
BogoMIPS:              5199.96

何が欠けていますか?プロセスがIOバウンドであっても、とにかく並列処理を見るべきではありませんか?並べ替えプロセスは、常に実際にオンになっているプロセッサの99%を使用するため、並列化が行われている場合は並列化を確認できます。メモリは問題ではありません。私は256 GBで遊ぶことができ、それ以外は何も使用されていません。

私がgrepをファイルにパイプしてから、sortでファイルを読み取るのを発見した何か:

 LC_ALL=C  grep -E  <files>  > reads.txt ; sort reads.txt  -u | wc -m

default, file 1m 50s
--parallel=24, file 1m15s
--parallel=48, file 1m6s
--parallel=1, no file 10m53s
--parallel=2, no file 10m42s
--parallel=4 no file 10m56s

others still running

これらのベンチマークを実行すると、パイプ入力の並べ替えがまったく並列化されないことが明らかになります。ファイルの読み込みが許可されている場合、ソートは指示どおりに負荷を分割します。


どのsortディストリビューションでそれは何ですか?標準sortはそのオプションを知りません。
ott-- 2015

uname -aによると、「3.13.0-46-generic#79-Ubuntu SMP」を提供lsb_release -aし、14.04.2コードネームの信頼性、およびgnu coreutilsの一部であるソートのバージョンを要求しman sortます。
ジェレミーケンボール2015

ニーズが再読み込みされることの部分はここにあるように思える: gnu.org/software/coreutils/manual/html_node/...
ハンヌ

@Hannuで何を取得しているのか理解できません。具体的に教えていただけませんか。sort --parallel = 2も並列化しません。4も8もしません。nprocは、本来のように48を返します。
ジェレミーケンボール2015

1
私は言うでしょう...これにはcoreutilsを使用しないでください。面白いことに、非常によく似た質問がありました。他のすべての方法の方が優れています
Journeyman Geek

回答:


24

sortは、必要でない限りスレッドを作成しません。小さなファイルの場合、オーバーヘッドが多すぎます。残念ながら、sortはパイプを小さなファイルのように扱います。24スレッドに十分なデータを供給したい場合は、大きな内部バッファーを使用するようにソートするように指定する必要があります(ソートは、大きなファイルが提示されると自動的に行われます)。これは、(少なくともドキュメントでは)アップストリームで改善すべきものです。したがって、次のようなものが必要になります。

(export LC_ALL=C; grep -E  <files> | sort -S1G --parallel=24 -u | wc -m)

すべてのプロセスにLC_ALL = Cを設定していることに注意してください。これらのプロセスはすべて、このデータを利用するためです。

ところであなたは次のようなものでソートスレッドを監視できます:

watch -n.1 ps -C sort -L -o pcpu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.