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:
- Obtenha o tamanho do arquivo buscando até o final e fazendo
ftell()
; - Divida esse resultado por 2;
- Use
fseek()
para procurar esse local; - Procure o início da próxima linha chamando
getline()
uma vez; - Use
strptime()
para descobrir em que data você está; - Faça uma busca binária, repetindo os passos 4 e 5 até encontrar a linha desejada.
Responder2
Você pode usar dd
algo 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 * 1024
bytes de dados em fs * 1024
bytes 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 ?
.