Existe um formato de compactação que suporte operações de cauda?

12

Estou procurando um formato de compactação que suporte a tailedição. Significando que você não precisa ler o arquivo inteiro para obter os últimos X bytes descompactados. Isso é possível com qualquer um dos formatos como bzip2, xz, lzma, etc?

Uma vez eu codifiquei algo usando o gzip que poderia fazer isso. Basicamente, em um nível realmente alto, o que ele fez foi agrupar vários blocos gzip juntos, então eu tinha um utilitário que poderia procurar de trás para frente a partir do final do arquivo até quando o último bloco foi iniciado. Esses arquivos foram totalmente legíveis pelos utilitários padrão do gzip, mas espero que exista algo um pouco mais padronizado disponível.

O objetivo final disso é o de arquivos de log que eu posso gravar compactados e, em seguida, poder tailusá - los (mesmo quando não foram totalmente gravados; por exemplo, streaming) sem ter que esperar que tudo seja lido do disco ou da rede.

Patrick
fonte

Respostas:

5

O gzip tem uma opção --rsyncable que faz essencialmente o mesmo . A parte não-padrão seria o utilitário "ztail" que reconhece o gzip-block, mas parece que você já lidou com isso.

o wabbit
fonte
2
É claro que essa opção efetivamente o limita a algo como -0,5 nível de compactação, mesmo se você especificar -9.
Psusi
onde você está adquirindo a versão do gzip que suporta isso? Se essa era uma opção em um ponto, parece ter sido removida.
Patrick
As distros baseadas no Debian possuem - isto é do Ubuntu 10.04: root @ backup1: ~ # gzip -V gzip 1.3.12 root @ backup1: ~ # gzip -h | egrep rsync --rsyncable Crie um arquivo compatível com rsync
the-wabbit
Aparentemente, alguns outros mantenedores de distribuição (por exemplo, Fedora) parecem ter incluído os patches também. E há um patch para um gzip antigo aqui: samba.org/netfilter/diary/gzip.rsync.patch que pode ser aplicado a uma versão mais recente com pequenas modificações, se você realmente precisar se compilar.
the-wabbit
BTW, as discussões sugerem que o impacto na compactação é bastante insignificante (entre 2 e 3%), embora a milhagem para um conjunto de dados específico possa variar. Se você precisar de compactação "disponível" com algoritmos adaptáveis ​​como deflate, dificilmente haverá uma maneira de redefinir o algoritmo de vez em quando - é claro que isso induzirá um impacto na eficiência da compactação.
the-wabbit
0

FWIW: Desenvolvi uma ferramenta de linha de comando no código-fonte zran.c do zlib, que cria índices para arquivos gzip: https://github.com/circulosmeos/gztool

Ele pode criar uma cauda contínua de um arquivo gzip com a -Topção Ou apenas um final do último conteúdo e pare com -t(Muitas outras opções disponíveis).

Observe que, para qualquer uma dessas ações, gztoolserá criado um arquivo de índice intercalado com essa ação.

Os índices podem ser interrompidos a qualquer momento e reutilizados e / ou concluídos posteriormente. E como gztoolé possível comandar a extração de dados de qualquer lugar no arquivo e criar o índice intercalado com essa ação, nunca há tempo perdido ao usá-lo.

circulosmeos
fonte