我想问一下,是否有一个开箱即用的多核等价物来执行一个‘溶胶-排序-- 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但尝起来有点过火。
发布于 2018-06-29 06:31:00
GNU sort有一个--parallel标志:
sort --parallel=8 data.tsv | uniq -c | sort --parallel=8 -n这将使用八个并发进程/线程来执行两个排序步骤中的每一个。uniq -c部件仍将使用单个进程。
正如Stéphane Chazelas在评论中指出的那样,sort的GNU实现已经被并行化(它使用POSIX线程),因此,只有当您希望它使用的线程多于内核时,才需要修改并发线程的数量。
请注意,由于使用sort步骤,第二个uniq可能会比第一个获得更少的数据,因此它将更快。
您还可以(可能)通过使用--buffer-size=SIZE和--batch-size=NMERGE来提高排序速度。请参阅sort手册。
为了进一步加快排序速度,请确保sort将其临时文件写入快速文件系统(如果您附带了几种类型的存储)。您可以通过将TMPDIR环境变量设置为这种挂载点上可写目录的路径(或者使用sort -T directory)来做到这一点。
发布于 2018-08-14 23:02:56
这对我来说更快。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 -nhttps://unix.stackexchange.com/questions/452569
复制相似问题