Como compactar um monte de arquivos com eficiência?

0

Digamos que você tenha muitos arquivos para arquivar. Eles estão em vários formatos de arquivo diferentes (txt, docx, pdf, png, jpg, mp3, zip, etc.).

Quais são as melhores práticas para compactar todas elas, para que elas ocupem o menor espaço possível?

Por exemplo, de acordo com essa questão , é basicamente inútil compactar um ou vários arquivos já compactados com o mesmo algoritmo de compactação, mas você pode obter taxas de compactação melhores usando diferentes algoritmos.

Outro exemplo: é melhor compactar arquivos com o mesmo formato de arquivo?

Não estou interessado em saber qual formato de compactação é o melhor em geral, mas seria interessante saber se alguns deles apresentam um desempenho melhor em alguns casos.

    
por CidTori 20.07.2018 / 10:42

1 resposta

0

Primeiro, além dos arquivos de texto e PDF, tudo o que você listou já está compactado. Arquivos DOCX são gzip (bem, realmente defina, mas eles usam um cabeçalho compatível com gzip) comprimido XML, PNG usa DEFLATE, JPG e MP3 fazem suas próprias coisas (a combinação de algoritmos usados por cada é específico para o seu formato) e arquivos ZIP use DEFLATE ou, ocasionalmente, BZip2. Destes, apenas JPEG e MPEG provavelmente obterão taxas de compactação significativamente melhores, mas isso é somente se eles foram minimamente compactados para começar, e mesmo assim os ganhos provavelmente serão mínimos. Os arquivos PDF podem não ser muito bem compactados, já que podem ser principalmente imagens e não texto, que provavelmente já foram compactados (geralmente usando a compactação JPEG).

Agora, isso fora do caminho, para suas perguntas principais:

O agrupamento de tipos de arquivos semelhantes ajuda?

Às vezes sim, às vezes não. Se os arquivos são todos menores que o tamanho do bloco do algoritmo de compressão, isso pode ajudar, possivelmente bastante. Se eles são todos maiores, geralmente não vai ajudar muito. No caso de arquivos de texto (texto simples ou arquivos que o encapsulam como PDF), o agrupamento de arquivos do mesmo idioma pode ajudar muito se os arquivos forem menores que o tamanho do bloco de compactação, pois geralmente haverá uma quantidade significativa de arquivos. redundância nos dados.

Se isso pode ou não ajudar no seu caso, é algo que você vai precisar testar.

Algum algoritmo é melhor em certos casos que outros?

Absolutamente. JPEG e MPEG camada 3 são exemplos disso. Ambos são otimizados para compactar um tipo muito específico de dados (imagens ou áudio). O Brotli é outro bom exemplo de um que é melhor em algumas circunstâncias, é otimizado para streaming de dados textuais. A maioria dos formatos de compactação que você usaria provavelmente são de propósito geral, o que geralmente significa que eles fazem um ótimo trabalho na compactação de dados textuais e um trabalho ruim na compactação de dados que não são estruturados em um fluxo de bytes. (DEFLATE é um algoritmo de propósito geral, um fato que realmente mostra quando você compara o tamanho de uma imagem PNG com uma imagem JPEG de outra forma idêntica).

Dado que você tem muitos dados mistos, provavelmente não deve se preocupar muito com isso.

Qual é a maneira mais eficiente de arquivar muitos dados para ocupar um espaço mínimo?

Provavelmente alguma variante do PAQ . Os algoritmos PAQ são geralmente considerados os melhores (em termos de taxa de compressão) algoritmos de compressão de propósito geral que estão amplamente disponíveis. Eles também usam FOREVER para compactar qualquer quantidade de dados razoavelmente grande, de modo que eles podem não ser práticos em seu caso particular. Opções mais realistas em termos de quanto tempo levam incluem:

  • XZ : Isso usa a compactação LZMA com algum pré-processamento extra que permite fazer um trabalho acima da média de compactação de código de máquina. Amplamente disponível em todas as plataformas, exceto no Windows (embora você possa obtê-lo no Windows) e geralmente obtém taxas de compactação realmente boas (o LZMA é um dos padrões ouro atuais para um algoritmo de compactação que obtenha desempenho razoável e boas taxas de compactação). >
  • zstd : Este é um novo desenvolvido pelos grandes engenheiros de software que trabalham para o Facebook. Na maioria dos casos, ele é executado mais rápido que o XZ e obtém taxas de compactação comparáveis (geralmente um pouco melhores em minha experiência). Ainda não está amplamente disponível, mas vale a pena tentar se você conseguir colocá-lo em seu sistema.

Em qualquer caso, você precisa de um formato de arquivo para agrupar os arquivos se quiser que eles sejam todos facilmente manipulados em um só lugar. Tar é o formato que eu costumo usar, mas eu principalmente lido com Linux. Um arquivo ZIP sem compactação (você pode fazer isso no Windows usando a linha de comando) também funcionará.

Se você tiver um número muito grande de arquivos, sugiro agrupá-los em vários arquivos menores em vez de um grande. Isso prejudicará um pouco suas taxas de compactação, mas economizará muito tempo depois quando você precisar extrair itens do arquivo e facilitar a recuperação de um arquivo danificado.

Se você pretende configurar corretamente os dados de recuperação para o seu arquivo, faça-o para qualquer que seja o formato final que você vai armazenar em disco (assim, o arquivo final, compactado, arquivo ou arquivos). Uma única alteração de bit em um fluxo de dados compactado pode alterar completamente o resultado da descompactação desse fluxo, portanto, corrigir os erros antes da descompactação é um pouco mais fácil do que fazer depois (porque a descompactação amplificará o tamanho do erro).

    
por 20.07.2018 / 21:31