multicore equivalente para '| classificar | uniq -c | comando sort -n '

4

Gostaria de perguntar se existe um equivalente multicore fora da caixa para um '| classificar | uniq -c | ordenar -n 'comando?

Sei que posso usar abaixo do procedimento

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 o gosto é um pouco exagerado.

    
por tomekpe 29.06.2018 / 08:23

2 respostas

8

O% GNUsort tem um sinalizador --parallel :

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

Isso usaria oito processos / threads simultâneos para executar cada uma das duas etapas de classificação. A parte uniq -c ainda estará usando um único processo.

Como Stéphane Chazelas aponta nos comentários, a implementação GNU de sort já está em paralelo (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 o você tem núcleos.

Observe que o segundo sort provavelmente receberá muito menos dados do que o primeiro, devido à uniq , 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 o manual sort .

Para agilizar ainda mais a classificação, certifique-se de que sort grave seus arquivos temporários em um sistema de arquivos rápido (se houver vários tipos de armazenamento anexados). Você pode fazer isso configurando a variável de ambiente TMPDIR para o caminho do diretório gravável em tal ponto de montagem (ou use sort -T directory ).

    
por 29.06.2018 / 08:31
0

Isso é mais rápido para mim. YMMV (definitivamente depende de quantos duplicados existem):

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
    
por 15.08.2018 / 01:02