
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
- Veja se você tem o
parallel
programa em seu sistema. (Pode vir do GNU.) Se sim, descubra como usá-lo. De outra forma, - Execute sua
find
saída em um arquivo. Usando um editor de texto, ou possivelmente um script usando ferramentas comohead
, 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 16awk … | 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
foi 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 substring
uso grep -c
comoScottsugere:
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 --gnu
argumentos à linha de comando para paralelo. Para tornar a alteração permanente, --gnu
adicione ~/.parallel/config
.