Executando verificação de segurança...
3

Dúvida: Como Funciona Um Compactador De Arquivos?

Sou iniciante na área e queria entender a lógica de como funciona um winrar por exemplo, como ele consegue diminuir o tamanho de um arquivo sem perder dados?

Alguem sabe explicar de forma simples pra alguém leigo nessa área?

Carregando publicação patrocinada...
2

Depende, existem vários algoritmos diferentes, cada um com seus prós e contras. Dadas as suas características, um pode ser melhor para determinados tipos de dados (texto com muita repetição, ou imagem, etc), outro pode ser bom para uso geral mas é mais lento que os outros, etc.

Enfim, no link acima tem um resumo básico de vários algoritmos. Se quiser entrar em detalhes, pode fazer buscas sobre "how [algorithm] works" - não vale a pena detalhar um a um, pois todos costumam ser complexos e geralmente as buscas específicas te darão todos os detalhes.

Só pra citar um exemplo, uma forma comum para compactar texto é criar uma estrutura que contém as ocorrências de determinadas partes. Simplificando bastante (pois os algoritmos reais são mais complexos que isso), vamos supor que eu tenho um arquivo texto que possui a palavra "algoritmo" 5 vezes, nas posições 1, 25, 42, 100 e 200. Ou seja, só essa palavra ocupa 9 bytes, vezes 5 ocorrências, dá um total de 45 bytes (supondo que o arquivo foi salvo com um encoding que codifica caracteres ASCII com apenas 1 byte, claro).

Um algoritmo bem rudimentar para compactar seria criar uma estrutura que contém a palavra e uma lista das posições em que ela aparece. Ou seja, eu preciso dos 9 bytes da palavra, e mais 5 bytes referentes aos números (total: 14 bytes). Faço isso para todas as palavras. Mais ainda, posso fazer para sequências de caracteres (podendo ter várias palavras inclusive) que se repetem com mais frequência, pois daí eu maximizo a economia de bytes. No final o arquivo compactado só tem essa estrutura (o mapeamento de sequências de caracteres e suas respectivas posições). Na hora de montar o arquivo original, basta ir lendo as posições e escrevendo a sequência novamente.

Como eu disse, essa é uma versão bem simplificada, pois os algoritmos reais são mais complexos. Sem contar que esse exemplo que citei funciona melhor para texto, mas só se tiver muitas repetições. Para imagens, músicas e vídeos, são usados outros algoritmos, dada a natureza bem diferente dos dados (e como já dito, compensa mais pesquisar um algoritmo de cada vez).

2

Sabe como funciona a minificação? Em termos muito simples é isso. ELe elimina o que não precisa. Elimina o que está lá por burocracia ou atender uma demanda que não é necessária em todas as situações. Bem, é um jeito de ver, a minificação tem perda de dados, que não deixa de funcionar.

Complementando o que já foi dito, o básico é encontrar padrões que podem ser representados de uma outra forma mais eficiente.

Os dados tendem a desperdiçar bits de alguma forma, seja no mais básico e simples, até mesmo um único byte, ou em um grupo de dados por completo enorme onde você pode analisar e criar padrões que podem economizar bits.

Cada tipo de dados pode ter um algoritmo que funciona melhor e alguns deles podem tender a conseguir mais compactação em troca de pior performance.

E pode até mesmo escolher se será bem ruim para compactar mas rápido para descompactar ou o contrário, ou algum balanço. Cada necessidade tem uma forma que entrega algo melhor. Imagine que tem coisas que raramente descompacta ou compacta e é distribuído para descompactar muito, ou precisa entregar compactado ou descompactar muito rápido para não atrasar (manter baixa latência).

Como alguns dados aparecem muito mais que outros é possível estabelecer que estes serão representados com menos bits (bem menos que 8), o que vai obrigar alguns dados serem representados com mais de 8 bits (até 15), o que não é problema porque eles aparecerão poucas vezes.

Você pode ter longos textos ou outras formas padrões que você pode criar uma tabela e usar alguns bits (pouco ou muitos) para cada palavra ou até mesmo frase. O ganho pode ser imenso.

Exemplo bem tosco do ganho:

abababababababababababab == 12ab

Fonte.

Compressão por repetição

Em uma imagem e outros tipos de arquivos semelhantes você tem muitos dados extremamente repetidos e pode dizer qual é o dado e quantas vezes repete, e em que padrão. Se for vídeo dá para fazer mais ainda porque cada quadro pode ter pixels que não mudam, você só precisa informar isso, não todos os bytes necessários para representar um único pixel. E tem alguns conceitos matemáticos aplicados bem interessantes que podem economizar muito.

Uma coisa que muita gente deve pensar que seria bom ir compactando o que já está compactado e ficar cada vez melhor. Mas isso não é possível. Pelo menos não na física tradicional :P Quando o dado já está bem eficiente em espaço tentar achar um padrão que permita economizar mais é quase impossível ou até tem efeito contrário. Experimenta compactar algo já compactado, pode ser um vídeo. Se o software for inteligente ele percebe e não compacta, se não for ele gastará um tempão e possivelmente o resultado será um arquivo maior :D

Algumas pessoas gostam de distinguir compactação (sem perda de dados) e compressão (com perda de dados), mas há discordâncias quanto ao uso do termo.

Alguns tipos de dados, como vídeo e áudio, pode ser interessante eliminar (antes de compactar tradicionalmente) alguns dados. Sons que o humano não pode ouvir, diferenças de cor que não conseguem ser percebidas, ou alguma coisa nesse sentido. Há uma perda de dados, o descompactado não será idêntico ao original, mas ninguém percebe, e pode dar um ganho enorme. Em alguns casos pode ter ganho maior que 99,9%.

Não sei com oestá hoje, mas os algoritomos mais usados semrpe foram o LZW (e diversas variações dele) e o Huffman. Muitas vezes os mais modernos compactadores usam uma forma otimnizada deles ou até apenas escolhem melhor os parâmetros e quando escolhe um ou outro.

Me lembro na faculdade, logo no primeiro semestre tivemos que criar alguns algoritmos assim, de forma bem simplificada, foi uma experiência interessante e uma das melhores do curso. Por que não tenta fazer um bem simples que só funcione em alguns casos, sem estudar nada mesmo, pelo menos por repetição.

Não vou repetir links já postados. Mas nunca deixe de ver a Wikipedia. Obviamente que em inglês é muito melhor e tem melhores referências para se aprofundar.

O que é Gzip? Como ele melhora um site?

Faz sentido para você?

Espero ter ajudado.

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1