Я намагаюсь зробити унікальний набір рядків, витягнутих із файлу з egrep з sort -u, а потім порахувати їх. Близько 10% рядків (усі 100 символів довжиною з алфавіту [ATCG]) дублюються. Є два файли, по 3 гіга в кожному, 50% не мають значення, тому, можливо, 300 мільйонів рядків.
LC_ALL=C grep -E <files> | sort --parallel=24 -u | wc -m
Між LC_ALL = C і використанням -x для прискорення грипу, найповільніша частина на сьогоднішній день - це сортування. Читання сторінок man привело мене до --parallel = n, але експериментація абсолютно не покращила. Трохи копання зверху показало, що навіть при --parallel = 24, процес сортування запускається лише на одному процесорі за один раз.
У мене є 4 мікросхеми з 6 ядрами і 2 потоками / ядром, що дає в цілому 48 логічних процесорів. Дивіться lscpu, оскільки / proc / cpuinfo буде занадто довгим.
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 Гбіт, і нічим іншим не користується.
Щось я виявив підключення grep до файлу, а потім зчитування файлу з сортуванням:
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
не знає.