Сортувати - паралельно не паралельно


10

Я намагаюсь зробити унікальний набір рядків, витягнутих із файлу з 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

Виконуючи ці орієнтири, цілком зрозуміло, що при введенні трубопроводних типів взагалі не паралельно. Коли дозволено читати файл, сортується навантаження відповідно до інструкцій.


Що sortце за який розподіл? Цей стандарт sortне знає.
ott--

uname -aнадає "3.13.0-46-generic # 79-Ubuntu SMP" і lsb_release -aвимагає 14.04.2 кодового імені, достовірного, і версії сортування, що є частиною gnu coreutils, згідно man sort.
Джеремі Кембол

Мені здається, тут є частини, які потрібно перечитати: gnu.org/software/coreutils/manual/html_node/…
Hannu

Я не впевнений, що я розумію, що ви отримуєте у @Hannu, чи можете ви бути більш конкретними? sort --parallel = 2 також не паралельно. Ні 4, ні 8. nproc не повертає 48 так, як слід.
Джеремі Кембол

1
Я б сказав ... не використовуйте для цього coreutils. Забавно у нас було дуже схоже запитання і добре .... кожен інший метод працює краще superuser.com/a/485987/10165
Journeyman Geek

Відповіді:


24

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.