Executar fgrep multicore mac os x

3

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?

    
por Ilario Ferrocino 12.02.2015 / 14:24

3 respostas

5

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

    
por 12.02.2015 / 15:58
4

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".

    
por 12.02.2015 / 17:55
0

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
    
por 12.02.2015 / 22:20