usando awk com paralelo

1

Eu tenho cerca de 3.000 arquivos com 300MB cada, e gostaria de pesquisá-los para uma série de substrings o mais rápido possível com meu servidor de 16 núcleos.

Isso é o que eu tentei, mas não parece paralelizar a pesquisa dos arquivos.

sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc

Ele é colado em conjunto a partir de diferentes instruções, não entendo completamente. Você tem alguma sugestão de como eu posso dividir o processamento de arquivos?

    
por kelorek 26.02.2013 / 06:44

2 respostas

1

  1. Veja se você tem o programa parallel em seu sistema. (Pode vir do GNU.) Se fizer isso, descubra como usá-lo. Caso contrário,
  2. Execute seu find com saída para um arquivo. Usando um editor de texto, ou possivelmente um script usando ferramentas como head , divida esse arquivo em 16 arquivos de fragmento com números (aproximadamente) iguais de linhas (ou seja, referenciando números iguais de arquivos encontrados). Em seguida, inicie 16 awk … | paste … | bc pipelines; um para cada arquivo de fragmento. (E adicione os 16 resultados.)

Estou me perguntando por que você está usando awk para contar ocorrências de uma string quando grep -c é especificamente projetado para fazer isso.

    
por 26.02.2013 / 07:22
1

O GNU parallel é bastante compatível com o xargs, no seu caso ele pode substituí-lo. Se você está apenas contando as ocorrências de substring use grep -c como Scott sugere:

sudo find /mnt2/preprocessed/preprocessed/mo* | 
  sudo parallel grep -c source | paste -sd+ | bc

Note que algumas versões do GNU / Linux instalam o GNU paralelo no modo compatível "paralelo do Tollef". Você pode alterar isso adicionando --gnu aos argumentos da linha de comando para paralelo. Para tornar a alteração permanente, adicione --gnu a ~/.parallel/config .

    
por 26.02.2013 / 11:04