Existe outra maneira de tornar as coisas mais rápidas:
Use grep -f file1 file2 >output.txt
.
Você também pode usar o gnu paralelo: link
Estou executando este comando no meu Mac OS X em 8 núcleos:
for i in $(cat file1);do grep "$i" file2; done > output.txt
Meu arquivo2 tem 9 milhões de linhas, portanto, leva muito tempo. É possível usar todos os núcleos para dividir o trabalho e fazer tudo mais rápido?
Existe outra maneira de tornar as coisas mais rápidas:
Use grep -f file1 file2 >output.txt
.
Você também pode usar o gnu paralelo: link
grep -F -f needles.txt haystack.log
é o que você quer.
-F
faz o grep usar correspondência de padrões simples, se você não precisa de regex completo. Isso tende a ser uma grande aceleração. Dependendo do que você está procurando, você pode não precisar de regex, então também pode obter os benefícios da execução mais rápida de código mais simples.
-f
é um arquivo de padrões que você está procurando. Então, em vez de fazer varreduras N completas para N padrões, você pode fazer isso em uma única passagem. Esta é também uma grande aceleração em todos os arquivos que são grandes demais para caber na RAM.
Coloque o arquivo pelo qual você está pesquisando em um disco rápido. O SSD não é necessariamente a resposta aqui, pois o grep faz uma varredura de maneira muito linear, o que é ótimo com um disco giratório normal, e especialmente rápido quando você tem uma matriz deles.
A combinação dos dois switches, mais a velocidade do disco rígido, pode tornar o grep muito rápido. Se os seus dados forem altamente repetitivos (bem compressíveis), talvez você queira tentar armazená-los com gzip e pesquisá-los com o zgrep. Isso ajuda extra se o armazenamento não for particularmente rápido.
Se você é responsável pela forma como os dados são inseridos nos arquivos, reduza as coisas. Não desperdice muito espaço para estrutura e retire os dados que não estão carregando nenhuma informação (pense dentro do UUID ou espaços e novas linhas entre marcas XML), torna os logs menores, o que torna o tempo de leitura do disco e a análise tempo mais curto.
Às vezes, na verdade, é mais rápido fazer uma dupla análise. Isso é altamente dependente de dados. Por exemplo, se você está procurando por um pedaço de dados que é complicado analisar, mas ocorre apenas em pequenas quantidades de entradas facilmente identificáveis por outra expressão fácil de analisar, faça uma primeira passagem para a expressão fácil. Isso reduz os dados necessários para executar a expressão lenta / complicada.
Se isso não ajudar, então split -l
dos arquivos e execute grep
com parallel
. Lembre-se de que o tempo total de divisão / gravação de vários arquivos e, em seguida, ter vários processos tentando usar o mesmo disco ao mesmo tempo pode ser prejudicial ao tempo total que o trabalho leva. Se você puder dividir o arquivo grande em arquivos menores em vários discos, então sim, as pesquisas provavelmente serão mais rápidas dessa maneira.
Um erro comum que vi pessoas fazerem, é tentar colocar os arquivos divididos no ramdisk. Isso é você fazendo cache, mal. O sistema operacional provavelmente fará um trabalho melhor usando a mesma quantidade de memória ram para armazenar em cache o que você está realmente trabalhando, não o arquivo inteiro.
Além disso, você deseja monitorar a atividade da CPU e do disco enquanto joga com os diferentes cenários e aprender a diferença entre "afunilamento" e "saturação".
Com base em link
parallel -k parallel --pipepart --block 100M -a file2 -k grep {} :::: file1
Mais simples e talvez mais rápido:
parallel -j0 -k grep {} file2 :::: file1
Tags grep osx parallelism