многоядерный эквивалент для ‘| сортировать | uniq -c | команда сортировки -n ‘

Я хотел бы спросить, есть ли готовый многоядерный эквивалент для ‘| сортировать | uniq -c | команда сортировки -n ‘?

Я знаю, что могу использовать ниже процедуру

split -l5000000 data.tsv '_tmp'; ls -1 _tmp* | while read FILE; do sort $FILE -o $FILE & done; sort -m _tmp* -o data.tsv.sorted 

Но на вкус это немного ошеломляет.

    У sort GNU есть флаг --parallel :

     sort --parallel=8 data.tsv | uniq -c | sort --parallel=8 -n 

    Это будет использовать восемь параллельных процессов / streamов для выполнения каждого из двух этапов сортировки. Часть uniq -c прежнему будет использовать один процесс.

    Как отмечает Стефан Шазелас в комментариях, реализация sort в GNU уже распараллелена (она использует streamи POSIX), поэтому изменение количества одновременных streamов необходимо только в том случае, если вы хотите использовать больше или меньше streamов, чем у ваших ядер.

    Обратите внимание, что второй sort , скорее всего, получит намного меньше данных, чем первый, благодаря шагу uniq , поэтому он будет намного быстрее.

    Вы также можете (возможно) улучшить скорость сортировки, --buffer-size=SIZE с параметрами --buffer-size=SIZE и --batch-size=NMERGE . Смотрите руководство по sort .

    Чтобы еще больше ускорить сортировку, убедитесь, что sort записывает свои временные файлы в быструю файловую систему (если у вас есть несколько типов хранилищ). Вы можете сделать это, установив для TMPDIR среды TMPDIR путь к каталогу, доступному для записи, в такой точке монтирования (или используйте sort -T directory ).

    Это быстрее для меня. YMMV (это определенно зависит от количества дубликатов):

     parallel --lb --pipepart --block 15m -a /tmp/big.file 'sort | uniq -c' | awk '{ count[$2] += $1 } END { for(elem in count) print count[elem], elem }' | sort -n