Estou procurando uma ferramenta de compactação com um dicionário arbitrariamente grande (e "tamanho do bloco"). Deixe-me explicar por meio de exemplos.
Primeiro, vamos criar dados aleatórios de 32 MB e, em seguida, concatená-los a si mesmo para criar um arquivo com o dobro do comprimento de 64 MB.
head -c32M /dev/urandom > test32.bin
cat test32.bin test32.bin > test64.bin
Claro que test32.bin
não é compressível porque é aleatório, mas a primeira metade test64.bin
é igual à segunda metade, então deve ser compressível em aproximadamente 50%.
Primeiro vamos tentar algumas ferramentas padrão. test64.bin tem exatamente o tamanho 67108864.
- gzip -9. Tamanho compactado 67119133.
- bzip2 -9. Tamanho compactado 67409123. (Uma sobrecarga muito grande!)
- xz-7. Tamanho compactado 67112252.
- xz-8. Tamanho compactado 33561724.
- zstd --ultra-22. Tamanho compactado 33558039.
Aprendemos com isso que gzip e bzip2 nunca podem compactar esse arquivo. No entanto, com um dicionário grande o suficiente, xz e zstd podem compactar o arquivo e, nesse caso, zstd faz o melhor trabalho.
No entanto, agora tente:
head -c150M /dev/urandom > test150.bin
cat test150.bin test150.bin > test300.bin
test300.bin tem o tamanho exato de 314572800. Vamos tentar os melhores algoritmos de compactação novamente em suas configurações mais altas.
- xz-9. Tamanho compactado 314588440
- zstd --ultra-22. Tamanho compactado 314580017
Nesse caso, nenhuma ferramenta pode compactar o arquivo.
Existe uma ferramenta que tenha um tamanho de dicionário arbitrariamente grande para que possa compactar um arquivo como test300.bin?
Graças ao comentário e resposta, tanto zstd quanto xz podem fazer isso. No entanto, você precisa do zstd versão 1.4.x.
- zstd --long=28. Tamanho compactado 157306814
- xz -9 --lzma2=dict=150MiB. Tamanho compactado 157317764.
Está pelo menos disponível com o
xz
comando. Axz
página de manual tem:Conforme documentado na seção de cadeias de filtro de compressor personalizado , você pode simplesmente fornecer manualmente o tamanho do dicionário
xz
com, por exemplo--lzma2=dict=150MiB
(temos informações de insights dizendo que 150MiB é suficiente, caso contrário, em dúvida, o tamanho do arquivo teria que ser usado).Ao fazer isso, o
xz
processo no amd64 permaneceu a maior parte do tempo em cerca de 1,6 g de uso de memória residente.