Eu gostaria de perguntar se existe um equivalente multicore pronto para uso para um '| classificar | uniq -c | comando sort -n'?
Eu sei que posso usar o procedimento abaixo
split -l5000000 data.tsv '_tmp';
ls -1 _tmp* | while read FILE; do sort $FILE -o $FILE & done;
sort -m _tmp* -o data.tsv.sorted
Mas tem um gosto um pouco exagerado.
GNU
sort
tem um--parallel
sinalizador:Isso usaria oito processos/threads simultâneos para fazer cada uma das duas etapas de classificação. A
uniq -c
peça ainda estará usando um único processo.Como Stéphane Chazelas aponta nos comentários, a implementação GNU de
sort
já está paralelizada (está usando threads POSIX), portanto, modificar o número de threads simultâneos só é necessário se você quiser usar mais ou menos threads do que você tem núcleos.Observe que o segundo
sort
provavelmente obterá muito menos dados do que o primeiro, devido àuniq
etapa, portanto, será muito mais rápido.Você também pode (possivelmente) melhorar a velocidade de classificação brincando com
--buffer-size=SIZE
e--batch-size=NMERGE
. Veja osort
manual.Para acelerar ainda mais a classificação, certifique-se de
sort
gravar seus arquivos temporários em um sistema de arquivos rápido (se você tiver vários tipos de armazenamento anexado). Você pode fazer isso definindo aTMPDIR
variável de ambiente para o caminho do diretório gravável em tal ponto de montagem (ou usesort -T directory
).Isso é mais rápido para mim. YMMV (definitivamente depende de quantas duplicatas existem):