o comando “cat” pode usar multi-processos

1

Eu preciso juntar vários arquivos em um diretório em uma caixa unix que tenha 8 núcleos. Eu estou procurando uma maneira rápida de mesclar esses arquivos. O comando cat usa apenas um núcleo ... existe uma maneira de fazer com que ele use vários núcleos para processamento paralelo.

    
por CruncherBigData 04.07.2013 / 06:57

3 respostas

6

Não há uma maneira efetiva de paralelizar uma operação de E / S anexada; cada linha deve ser escrita por vez.

    
por 04.07.2013 / 07:04
2

Antes de mais nada, confirme o desempenho do gargalo. O multi-thread é inútil se o disco io for o seu gargalo.

Se você tiver um disco ou SSD realmente rápido, poderá determinar o tamanho dos arquivos, calcular deslocamentos e usar vários comandos dd.

    
por 26.08.2013 / 06:26
0

Que tal um script como este (com o sleeps para demonstrar como ele paralela as operações):

#!/bin/bash

eval exec 3\<<(echo FIRST FILE; sleep 3)
eval exec 4\<<(echo SECOND FILE; sleep 3)

cat <&3
cat <&4

Ele paraleliza a leitura dos arquivos de entrada. Observe que isso é limitado de várias maneiras e não paraleliza a saída, mas isso não pode ser feito de qualquer maneira.

Aqui está um exemplo mais completo que processa todos os arquivos no diretório atual:

#!/bin/bash

fd=3
for file in *
do
    eval exec $fd\<<(cat $file)

    fd=$((fd + 1))
done

out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
    cat <&${out_fd}
    out_fd=$((out_fd + 1))
done

Os pontos acima sobre desempenho são bons; há uma chance de isso não ajudar em nada.

Atualizar Pensando melhor, isso só será pré-buscado até o tamanho do buffer do pipe, 64k. A seguinte modificação irá puxar todos os arquivos para a memória; se não couberem, não use:

#!/bin/bash

fd=3
for file in *
do
    eval exec $fd\<<(content=$(<$file); echo "$content")

    fd=$((fd + 1))
done

out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
    cat <&${out_fd}
    out_fd=$((out_fd + 1))
done
    
por 28.08.2013 / 07:35