私は、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
これらのベンチマークを実行すると、パイプ入力の並べ替えがまったく並列化されないことが明らかになります。ファイルの読み込みが許可されている場合、ソートは指示どおりに負荷を分割します。
uname -a
によると、「3.13.0-46-generic#79-Ubuntu SMP」を提供lsb_release -a
し、14.04.2コードネームの信頼性、およびgnu coreutilsの一部であるソートのバージョンを要求しman sort
ます。
sort
ディストリビューションでそれは何ですか?標準sort
はそのオプションを知りません。