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.
sumber
sort
itu distribusi yang mana? Standarsort
tidak tahu opsi itu.uname -a
memberikan "3.13.0-46-generik # 79-Ubuntu SMP" danlsb_release -a
mengklaim 14.04.2 nama kode tepercaya, dan versi pengurutan yang merupakan bagian dari gnu coreutils, menurutman sort
.Jawaban:
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:
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:
sumber