Por que arquivos tar.xz criados com Python são menores do que os criados com o tar padrão?
(superuser.com)-
O arquivo criado com o
tarfiledo Python ficou 15 vezes menor do que o arquivo criado com otardo macOS -
Causa: o BSD/GNU
tarcoloca os arquivos dentro do arquivo compactado sem ordenação, então, dependendo do tipo de arquivo, a taxa de compressão pode piorar
→ a função tarfile do Python usa ordenação por padrão
- No GNU
tar, é possível usar a opção--sortpara ordenar porname/inodeao inserir os arquivos → ao aplicar a ordenação, obtém-se a mesma taxa de compressão
4 comentários
Estou meio sem entender: por que a taxa de compressão muda quando se aplica ordenação? A taxa de compressão de cada arquivo individualmente seria a mesma, não?
O algoritmo usado é o Deflate. Ele mantém, em uma janela deslizante, o conteúdo que já foi usado anteriormente na compressão. Se desta vez ele processou 10 bytes, esses 10 bytes processados no momento são adicionados ao final da janela deslizante, e o tamanho dessa janela é fixo.
Quando encontra um conteúdo igual ao que está na janela deslizante, ele comprime escrevendo um LLD (Literal, Length, Distance) no lugar.
Distanceindica a partir de onde, na janela deslizante, está o conteúdo igual;Length, o tamanho desse trecho igual na janela deslizante; eLiteral, o primeiro caractere que não é igual.Como, no Deflate, é importante o que está armazenado na janela deslizante, também é importante se ele viu um conteúdo semelhante logo antes; se ele tiver visto arquivos semelhantes, há uma chance maior de conseguir uma compressão melhor.
A forma como a compressão é feita pode ser vista no slide abaixo. (
gziptambém é baseado em Deflate.)https://speakerdeck.com/dalinaum/…
Como o conteúdo de arquivos com o mesmo nome ou nomes parecidos dentro da mesma pasta tende a ser semelhante, a taxa de compressão deve ser maior.
Acho que a ideia é que, como o alcance para encontrar essas semelhanças durante a compactação não é tão amplo, se os arquivos forem ordenados, aumenta a chance de esses arquivos parecidos ficarem agrupados e serem comprimidos juntos.