shell script para ler vários arquivos em paralelo

4

Eu preciso escrever um script que seja executado paralelamente e procure por uma string em vários arquivos.
Tentei muitas opções, mas elas diminuíram a velocidade do meu processador.

    
por helloworld0722 06.09.2012 / 01:16

3 respostas

3

Se os arquivos estiverem em discos separados, execute um comando grep em cada disco.

Para arquivos no mesmo disco, o afunilamento está sendo lido no disco. Ler de vários arquivos em paralelo só piorará a velocidade.

Se os arquivos estiverem em uma matriz RAID 0, você poderá obter um aumento de velocidade executando dois comandos grep ao mesmo tempo. Referência para ver se você realmente ganha tempo. A maneira de baixa tecnologia:

grep file1 file2 file3 &
grep file4 file5 file6

Com paralelo GNU :

parallel -j 2 grep ::: file1 file2 file3 file4 file5 file6

Se você estiver recebendo arquivos de find :

find … -print0 | parallel -0 -j 2

Lembre-se: se os arquivos estiverem no mesmo disco, um único comando grep será o mais rápido.

    
por 06.09.2012 / 02:26
2

Suponho que seus arquivos sejam muito grandes (caso contrário, você provavelmente não se importaria em fazer o paralelismo do trabalho).

As sugestões GNU parallel são boas (e a xargs do GNU também tem uma opção -P para execução paralela) MAS porque o arquivo (ou arquivos) é um I / O operação de ligação, não vinculada à CPU, você pode descobrir que executar múltiplos greps em paralelo na verdade atrasa as coisas, porque agora você tem vários processos competindo pelo acesso ao disco.

A velocidade de E / S é o fator limitante aqui, não a potência da CPU. Mesmo um único processo grep provavelmente está gastando a maior parte do tempo esperando por dados do disco (ou seja, a CPU está quase inativa).

Se os arquivos não estiverem fisicamente próximos uns dos outros no disco, ele pode ser MUITO vezes mais lento, já que os cabeçotes de disco precisam se mover muito mais (claro, isso não seria problema em um SSD ou um ramdisk ou se os arquivos já estão em cache)

    
por 06.09.2012 / 03:37
2

Você pode experimentar o GNU paralelo:

find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {}

(de link )

Edit: Observe que outros comentários que afirmam que o grep será executado mais rapidamente sequencialmente, se o gargalo for IO, estão corretos.

    
por 06.09.2012 / 02:01