opções de compactação sem buffer do linux

1

Estou trabalhando em um sistema embarcado e devido a restrições persistentes de memória, eu preciso compactar um arquivo de log "on the fly".

Meu objetivo é ter um liner dentro de um script, que seria assim:

(myLaunchScript.sh 2>&1 | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }' | busybox gzip -c > /mnt/persistenMem/log_app.log.gz 2>&1 )&

  • O awk é um ajudante para adicionar datetime a rastreios. Isso reduz a sobrecarga no aplicativo printf.

O problema é que essa implementação perde a saída se o sistema for desligado inesperadamente, pois o gzip tem um buffer interno. Esse buffer interno pode ser diferente dependendo de quais opções o busybox foi compilado.

Existe alguma ferramenta de compactação que implemente uma lógica sem buffer?

Ou uma compactação de linha por linha? É possível?

    
por kikeenrique 10.02.2016 / 10:39

1 resposta

0

Talvez seja o buffer de stdout que está atrasando a saída. O buffer do pipe pode ser bastante grande , geralmente são várias linhas na melhor das hipóteses . Você pode verificar se consegue desativar .

A compactação de linha por linha não faz nada, pode até aumentar o arquivo. gzip (com base em DEFLATE ) e a maioria dos outros algoritmos de compactação funcionam em janelas deslizantes que são bastante grandes e também < em> tem para armazenar muitos dados passados (que não estão relacionados ao buffer de saída) para realmente comprimir qualquer coisa - a maior parte da compressão vem de dados anteriores (geralmente indiretamente, você descobre quais sequências são mais comuns e os códigos mais curtos na saída). Há um compromisso entre a taxa de compactação e o consumo de memória e, se você quiser compactar corretamente, precisará de uma estrutura de dados na memória que mantenha o dicionário atual. Ele também funciona em partes, não em byte, então as coisas não avançam até que uma quantidade suficiente de dados seja coletada.

Verifique se os argumentos numerados que definem a taxa de compactação fazem alguma coisa ( gzip -3 para o nível 3 em vez do padrão, que é 6 no meu sistema). Algumas implementações e algoritmos podem ter outras configurações ( bzip2 -s reduz o uso de memória - experimente, se você tiver em seu sistema).

Em suma, não tenho certeza se gzip faz qualquer buffer adicional. Eu não verifiquei o código-fonte para a implementação do busybox, mas imagino que não seja muito mais do que o necessário para o algoritmo. Eu realmente suspeito que os buffers de fluxo são o principal gargalo.

    
por 10.02.2016 / 12:42