'| 的多核等效项排序| uniq-c| sort -n' 命令

'| 的多核等效项排序| uniq-c| sort -n' 命令

我想问是否有开箱即用的多核等效项“|”排序| uniq-c| sort -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

但味道有点过犹不及。

答案1

GNUsort有一个--parallel标志:

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

这将使用八个并发进程/线程来完成两个排序步骤中的每一个。该uniq -c部件仍将使用单一流程。

正如 Stéphane Chazelas 在评论中指出的那样,GNU 实现sort已经是并行化的(它使用 POSIX 线程),因此只有当您希望它使用比您拥有的核心更多或更少的线程时才需要修改并发线程的数量。

sort请注意,由于该步骤,第二个获得的数据可能比第一个少得多,uniq因此速度会快得多。

您还可以(可能)通过使用--buffer-size=SIZE和来提高排序速度--batch-size=NMERGE。请参阅sort手册。

为了进一步加快排序速度,请确保将sort其临时文件写入快速文件系统(如果您连接了多种类型的存储)。您可以通过将TMPDIR环境变量设置为此类安装点上可写目录的路径(或使用sort -T directory)来完成此操作。

答案2

这对我来说更快。 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

相关内容