usando awk com paralelo

usando awk com paralelo

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

Foi isso que tentei, mas não parece paralelizar a pesquisa nos arquivos.

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

Está colado a partir de diferentes instruções, não entendo completamente. Você tem alguma sugestão sobre como posso dividir o processamento do arquivo?

Responder1

  1. Veja se você tem o parallelprograma em seu sistema. (Pode vir do GNU.) Se sim, descubra como usá-lo. De outra forma,
  2. Execute sua findsaída em um arquivo. Usando um editor de texto, ou possivelmente um script usando ferramentas como head, divida esse arquivo em 16 arquivos de fragmentos com números (aproximadamente) iguais de linhas (ou seja, referenciando números iguais de arquivos encontrados). Em seguida, inicie 16 awk … | paste … | bcpipelines; um para cada arquivo de fragmento. (E adicione os 16 resultados.)

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

Responder2

O paralelo GNU é bastante compatível com o xargs; no seu caso, ele pode substituí-lo. Se você estiver contando apenas ocorrências de substringuso grep -ccomoScottsugere:

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

Observe que algumas versões do GNU/Linux instalam o GNU paralelo no modo compatível com "Paralelo de Tollef". Você pode mudar isso adicionando --gnuargumentos à linha de comando para paralelo. Para tornar a alteração permanente, --gnuadicione ~/.parallel/config.

informação relacionada