Sortir --parallel tidak sejajar


10

Saya mencoba membuat unik satu set garis yang ditarik dari file dengan egrep dengan sort -u, lalu hitung. Sekitar 10% dari baris (semua 100 karakter dari alfabet [ATCG]) digandakan. Ada dua file, masing-masing sekitar 3 gigs, 50% tidak relevan, jadi mungkin 300 juta baris.

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

Antara LC_ALL = C dan menggunakan -x untuk mempercepat grep, bagian paling lambat sejauh ini adalah jenisnya. Membaca halaman manual membawa saya ke --parallel = n, tetapi eksperimen sama sekali tidak menunjukkan peningkatan. Penggalian sedikit dengan top menunjukkan bahwa bahkan dengan --parallel = 24, proses sortir hanya pernah berjalan pada satu prosesor pada satu waktu.

Saya memiliki 4 chip dengan 6 core dan 2 thread / core, memberikan total 48 prosesor logis. Lihat lscpu karena / proc / cpuinfo akan terlalu panjang.

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

Apa yang saya lewatkan? Bahkan jika prosesnya terikat IO, bukankah seharusnya saya melihat pemrosesan paralel? Proses sortir menggunakan 99% dari prosesor yang sebenarnya aktif pada waktu tertentu, jadi saya harus dapat melihat paralelisasi jika itu terjadi. Memori bukan masalah, saya memiliki 256 Gb untuk bermain dan tidak ada yang digunakan oleh yang lain.

Sesuatu yang saya temukan pemipaan grep ke file kemudian membaca file dengan mengurutkan:

 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

Dalam melakukan tolok ukur ini, cukup jelas bahwa ketika input yang disalurkan tidak sejajar sama sekali. Ketika diizinkan membaca file, pilah-pilah file sesuai dengan yang diinstruksikan.


Apa sortitu distribusi yang mana? Standar sorttidak tahu opsi itu.
ott--

uname -amemberikan "3.13.0-46-generik # 79-Ubuntu SMP" dan lsb_release -amengklaim 14.04.2 nama kode tepercaya, dan versi pengurutan yang merupakan bagian dari gnu coreutils, menurut man sort.
Jeremy Kemball

Menurut saya ada beberapa bagian di sini yang perlu dibaca kembali: gnu.org/software/coreutils/manual/html_node/…
Hannu

Saya tidak yakin saya mengerti apa yang Anda dapatkan di @Hannu, bisakah Anda lebih spesifik? sort --parallel = 2 juga tidak sejajar. Juga tidak 4 atau 8. nproc memberikan 48 seperti yang seharusnya.
Jeremy Kemball

1
Saya akan mengatakan ... jangan gunakan coreutils untuk ini. Yang mengherankan kami memiliki pertanyaan yang sangat mirip dan baik .... setiap metode lain berfungsi lebih baik superuser.com/a/485987/10165
Journeyman Geek

Jawaban:


24

sort tidak membuat utas kecuali jika diperlukan, dan untuk file kecil terlalu banyak overhead. Sayangnya sekarang semacam memperlakukan pipa seperti file kecil. Jika Anda ingin memberi makan cukup data ke 24 utas maka Anda harus menentukan untuk menyortir menggunakan buffer internal yang besar (sortir melakukan itu secara otomatis ketika disajikan dengan file besar). Ini adalah sesuatu yang harus kita tingkatkan di hulu (setidaknya dalam dokumentasi). Jadi, Anda akan menginginkan sesuatu seperti:

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

Catatan Saya telah menetapkan LC_ALL = C untuk semua proses, karena mereka semua akan mendapat manfaat dengan data ini).

BTW Anda dapat memonitor utas pengurutan dengan sesuatu seperti:

watch -n.1 ps -C sort -L -o pcpu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.