Compactar arquivos similares com eficiência

8

Freqüentemente tenho a necessidade de compactar arquivos muito semelhantes entre si.

Atualmente eu uso o 7Zip, que compacta um arquivo de 16GB em 1.2GB em cerca de 35 minutos usando 8 núcleos com configurações Ultra.

Parece-me que muito desse tempo é gasto na computação do dicionário para uso na compactação. Como os arquivos são altamente semelhantes, o dicionário realmente usado provavelmente também é semelhante.

Existe uma ferramenta de compressão baseada no Windows (7Zip com uma opção que não conheço, ou uma ferramenta diferente) que pode salvar o dicionário e reutilizar o dicionário salvo para arquivos subseqüentes?

Existe uma maneira melhor de abordar o problema de manter uma taxa de compactação semelhante à que eu tenho, enquanto a compactação é significativamente mais rápida?

    
por Eric J. 15.03.2013 / 13:50

2 respostas

3

O algoritmo de compressão Lempel-Ziv-Welch (LZW) é inerentemente computacionalmente intensivo, com a maior parte do trabalho sendo realmente computando o dicionário. Isso é literalmente como o LZW funciona.

O próprio algoritmo adiciona uma nova entrada de dicionário para cada próximo "símbolo" digitalizado e, assim, durante cada iteração, uma nova entrada é adicionada ao dicionário. De fato, o dicionário torna-se a cópia compactada do arquivo e, portanto, é na verdade a única coisa que a compactação LZW gasta algum tempo significativo computando em primeiro lugar.

Se você usasse algo como codificação Huffman , a reutilização do dicionário seria de fato possível (às custas de um possível taxa / tamanho de compressão sub-ótimo). No entanto, a maioria dos algoritmos de compressão modernos & As ferramentas usam o algoritmo LZW para eficiência e velocidade (a compressão Huffman exigiria duas passagens pelos dados [uma para gerar a árvore / tabela Huffman, outra para compactar os dados], enquanto a LZW pode ser completada em uma única passagem).

    
por 15.03.2013 / 14:02
2

Ao contrário do algoritmo DEFLATE, o LZMA do 7-Zip usa compactação sólida por padrão, o que aproveita a redundância entre arquivos. Isso funcionará com as configurações padrão, desde que os arquivos sejam pequenos o suficiente.

Com as configurações padrão de 2 GB para tamanho de bloco sólido , um arquivo de 16 GB é realmente compactado em 8 partes separadas.

Como o @Breakthorugh já disse, o dicionário é gerado na hora. Você pode verificar isso empiricamente definindo tamanho do bloco sólido para Sólido (compactar todos os arquivos de uma só vez) e Não sólido (compactar cada arquivo separadamente) .

Aumentar o tamanho do bloco sólido resultará em uma desaceleração, mas isso pode resultar em uma taxa de compactação muito melhor. Por exemplo, compactar dois arquivos idênticos resultará em um arquivo quase duas vezes maior com compactação não sólida.

    
por 15.03.2013 / 14:14