Como iniciar o processamento de um arquivo em deslocamento?

Como iniciar o processamento de um arquivo em deslocamento?

Caso de uso: você tem um arquivo de log de vários GB para uma semana inteira e precisa pesquisar algo que aconteceu no sábado usando, por exemplo grep, . Fazendo uma suposição fundamentada, você assume que iniciar a pesquisa a partir do meio do arquivo reduzirá mais da metade o tempo de processamento (já que definitivamente não será necessário processar todo o restante do arquivo), sem ignorar nenhum dado relevante. Isso é possível?

Responder1

Supondo que seus dados estejam em ordem cronológica:

  1. Obtenha o tamanho do arquivo buscando até o final e fazendo ftell();
  2. Divida esse resultado por 2;
  3. Use fseek()para procurar esse local;
  4. Procure o início da próxima linha chamando getline()uma vez;
  5. Use strptime()para descobrir em que data você está;
  6. Faça uma busca binária, repetindo os passos 4 e 5 até encontrar a linha desejada.

Responder2

Você pode usar ddalgo como:

dd if=log skip=xK bs=1M

o que pularia x * 1024 blocos de tamanho 1M (2 ^ 20). Consulte dd(1)para obter detalhes sobre o manuseio de unidades.

Se você quiser automatizar a pesquisa binária, supondo que seu log tenha a forma usual <date> [data]para a qual você pode canalizar a saída head -n 2, verifique a data no início dosegundolinha (que - sob a suposição razoável de linhas "normalmente" longas - estará completa) e decida qual metade você deseja.

Responder3

Obtenha o tamanho do arquivo e divida por 2. Divida por 1024 para obter KiB. (Ou 1024*1024 para obter MiB etc.)

((fs = $(stat -c %s logfile) / 2 / 1024))

Pular e pesquisar

dd if=logfile bs=1024 skip=$fs | grep blahblah

Você poderia expandir ainda mais isso, se o arquivo de log formuitoconsistente com a quantidade de dados pr. dia adicionando um count=valor a dd.

((cnt = $(stat -c %s logfile) / 5 / 1024))

dd if=logfile bs=1024 skip=$fs count=$cnt | grep blahblah

Isso canalizaria cnt * 1024bytes de dados em fs * 1024bytes deslocados.

Reúna tudo em um script e faça a tubulação fora do script para grep, arquivo temporário ou o que você quiser.

Responder4

Não está muito claro o que exatamente você quer fazer e o que você quer dizer com meu “processo”. Para arquivos grandes, meu programa interativo favorito é o less. Ele lida com arquivos grandes sem problemas. Também pode pular para uma porcentagem específica, por exemplo, usando 30%. Além disso, você pode pesquisar usando /e ?.

informação relacionada