Comparação de desempenho entre o processamento do arquivo de log [closed]

0

Estou processando arquivos de log grandes ~ 10 GB de tamanho e usando o zgrep para correspondência de padrões. Mas agora o caso de uso se tornou um pouco complexo e eu não posso usar o zgrep, então mudei a lógica para o awk e isso causou muito problema de desempenho.

Time
using zgrep ~1.5 minutes
using awk ~11 minutes
using python ~ 13 minutes

Eu tentei procurar no google por possíveis soluções, mas não consegui encontrar nenhuma. Como posso analisar com eficiência arquivos .gz?

Exemplo de entrada

String1:"Hello"
String2:"World"
String3:"Question"
End
String1:"HelloAgain"
String5:"Answer"
End
String1:"NewEntry"
String2:"Foo"
String5:"NewFile"
End

Exemplo de saída

Hello World
HelloAgain
NewEntry Foo

Esta é a pergunta original Iterar algum padrão usando shell .

    
por leo195 30.07.2017 / 05:00

1 resposta

1

Se tudo o que você está fazendo é correspondência de padrões em linhas individuais, é quase impossível superar grep (ou zgrep - que é basicamente uma implementação mais chique de zcat | grep ) para velocidade. Esse é o único propósito de grep , e foi otimizado ao longo de décadas exatamente para essa tarefa.

É também a ÚNICA coisa que grep pode fazer. O que também é parte da razão pela qual é tão rápido.

Se você precisar fazer mais do que isso (ex: parte de saída de uma linha se corresponder a um padrão e opcionalmente parte de outra linha se a primeira condição for verdadeira e a segunda linha corresponder a um padrão diferente - como na sua tarefa) isso é muito mais complexo e além do que o grep pode fazer.

Esse nível de complexidade é inerentemente mais lento do que apenas uma correspondência de padrão simples. Não há como evitar isso. É mais trabalho para o programa, e sempre será mais trabalho.

No entanto, algumas linguagens são mais rápidas do que outras em determinadas coisas e, pelo menos tão importante, o algoritmo que você escolhe para implementar sua tarefa (ou seja, como você escolhe fazê-lo) pode ter um enorme impacto no desempenho. / p>

Ao processar arquivos pequenos ou médios, a diferença de desempenho é insignificante, provavelmente nem perceptível, mas ao processar arquivos enormes (ou quando executados repetidamente, milhares de vezes) até pequenas diferenças de desempenho se somam e fazem uma diferença muito significativa para o tempo de execução.

por exemplo. seu script de shell original seria extremamente lento comparado a awk ou perl ou python (levando horas em vez de minutos, no mínimo) - isso é porque sh não é muito bom nessas tarefas. looping sobre dados de entrada de um arquivo em particular é muito lento em sh. O objetivo principal do shell é o controle de tarefas interativo e / ou de script, não fazer processamento de texto complexo por si só ( bash e zsh são muito mais capazes do que o antigo sh a esse respeito, mas um processamento de texto dedicado linguagem como awk ou perl será sempre melhor e mais rápida).

Resumindo:

  • escolha a melhor ferramenta para o trabalho
  • implemente um algoritmo rápido e bom.

BTW, "best" não é apenas a ferramenta mais adequada para o trabalho, mas também, em parte, a que você conhece melhor, e quão fácil será escrever o que você precisa nesse idioma. por exemplo. para muitas tarefas, awk e perl têm desempenho aproximadamente semelhante ( awk é normalmente um pouco mais rápido, mas perl tem muito mais funções integradas E uma biblioteca enorme de código para fazer quase tudo que você possa imaginar de, chamado CPAN . Se você conhece awk melhor que perl, então use awk. e vice-versa.

Eu costumo usar o awk para trabalhos mais simples e perl para os mais complexos. às vezes eu uso python, mas a maioria das coisas que eu escrevo são mais adequadas para perl do que python e eu sei perl muito melhor do que eu sei python.

    
por 30.07.2017 / 08:19