Não há uma maneira efetiva de paralelizar uma operação de E / S anexada; cada linha deve ser escrita por vez.
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.
Não há uma maneira efetiva de paralelizar uma operação de E / S anexada; cada linha deve ser escrita por vez.
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.
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
Tags cat multithreading