Compactando muitos arquivos grandes similares

17

Eu tenho centenas de arquivos grandes semelhantes (30 megabytes cada) que eu quero compactar. Cada par de arquivos tem 99% dos mesmos dados (menos de 1% de diferença), então espero não ter mais que 40-50 megabytes de arquivos.

Um único arquivo pode ser compactado de 30 MB a 13-15 MB (com xz -1 , gz -1 , bzip2 -1 ), mas ao compactar dois ou mais arquivos, quero ter um arquivo com tamanho 13-15MB + N*0.3MB em que N é o número de arquivos.

Ao usar tar (para criar um arquivo sólido) e xz -6 (para definir o dicionário de compactação como maior que um arquivo - Atualizar - isso não foi suficiente! ), ainda tenho arquivo com tamanho N*13MB .

Acho que gzip e bzip2 não me ajudarão porque têm um dicionário com menos de 1 MB e meu fluxo de taras tem repetições a cada 30 MB.

Como posso arquivar o meu problema no Linux moderno usando ferramentas padrão?

É possível ajustar xz para compactar rapidamente, mas use um dicionário maior que 30-60 MB?

Atualizar : fez o truque com tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz . Não tenho certeza sobre a necessidade das opções mf=hc4 e --memory=2G ; mas dict=128M define o dicionário para ser grande o suficiente (maior que um arquivo), e mode=fast torna o processo mais rápido que -e .

    
por osgx 18.03.2014 / 20:35

3 respostas

12

Dados seus detalhes, presumo que você tenha verificado que seus arquivos realmente têm 99% de dados em comum, com 1% de diferença contígua (ou quase contígua) neles.

Primeiro, você deve usar tar para fazer um arquivo com seus arquivos dentro dele. Para testes, eu criaria um .tar com 10 arquivos, então teria um tamanho de 300MB.

Em seguida, usando xz, você precisa configurá-lo para que o dicionário seja maior que o tamanho de um arquivo. Desde que você não diga se você tem restrições de memória, eu iria com xz -9. Não faz sentido não usar toda a memória disponível.

Eu também usaria o --extreme preset, para testar se faz diferença.

Tamanho do dicionário

Em uma documentação que tenho disponível - site - é dito que o dicionário tamanho é aproximadamente igual ao uso de memória descompressora. E o parâmetro -1 significa um ditado de 1 MiB, -6 significa 10 MiB (ou 8 MiB em outra parte do mesmo manual). É por isso que você não está obtendo nenhuma vantagem colocando esses arquivos juntos. Usar o -9 faria o decompessor (e, portanto, o dicionário) ter 64 MiB, e acho que é isso que você queria.

Editar

Outra possibilidade seria usar outro compressor. Eu usaria o 7zip, mas colocaria esses arquivos primeiro e depois 7zip.

Dependendo do conteúdo dos seus arquivos, talvez você possa usar 7zip com o método PPM-D (em vez de LZMA ou LZMA2, que é o padrão e o mesmo usado por xz)

Não é bom: Zip (dict = 32kB), Bzip (dict = 900 kB).

    
por 18.03.2014 / 20:59
9

Se eles são realmente 99% semelhantes, como você diz, você deve ser capaz de usar bsdiff ou um algoritmo similar para calcular diferenças entre os arquivos. A diferença é cumulativa (ou seja, cada arquivo difere um pouco mais do primeiro), ou a diferença entre quaisquer dois arquivos é praticamente a mesma?

Se não for cumulativo, você deve ser capaz de:

  • Pegue qualquer arquivo arbitrário como a "linha de base"
  • Executar bsdiff comparando o arquivo de linha de base com cada arquivo adicional
  • Armazene cada diff como um arquivo separado, ao lado do arquivo de linha de base
  • Execute um compressor como xz nos resultados (a linha de base + os diffs).

O resultado deve ser muito menor que apenas xz do arquivo inteiro.

Você pode "reconstituir" os arquivos originais "aplicando" o diff no início da linha de base para obter cada um dos outros arquivos.

    
por 18.03.2014 / 21:27
4

Você (I) pode usar o tar com algum arquivador capaz de detectar padrões de longo alcance, por exemplo, rzip ou lrzip ( Leia-me ). Ambos usam detecção / desduplicação de redundância de longo alcance, então o rzip usa bzip2 e o lrzip usa xz (lzma) / ZPAQ:

rzip is a compression program, similar in functionality to gzip or bzip2, but able to take advantage long distance redundencies in files, which can sometimes allow rzip to produce much better compression ratios than other programs. ... The principal advantage of rzip is that it has an effective history buffer of 900 Mbyte. This means it can find matching pieces of the input file over huge distances compared to other commonly used compression programs. The gzip program by comparison uses a history buffer of 32 kbyte and bzip2 uses a history buffer of 900 kbyte

O lrzip tem um buffer maior e pode usar muitos algoritmos de compactação (muito rápido, rápido, bom e um dos melhores - ZPAQ) após a deduplicação:

Lrzip uses an extended version of rzip which does a first pass long distance redundancy reduction. The lrzip modifications make it scale according to memory size.

The data is then either: 1. Compressed by lzma (default) which gives excellent compression at approximately twice the speed of bzip2 compression ...

Outra maneira é usar o bup - programa de backup com desduplicação em nível de bloco / segmento, com base no git packfile:

It uses a rolling checksum algorithm (similar to rsync) to split large files into chunks.

    
por 15.11.2015 / 18:38