Tenho centenas de arquivos grandes semelhantes (30 megabytes cada) que desejo compactar. Cada par de arquivos possui 99% dos mesmos dados (menos de 1% de diferença), portanto, espero não ter mais de 40 a 50 megabytes de arquivo.
Único arquivo pode ser comprimido de 30 MB de 13-15 MB (com xz -1
, gz -1
, bzip2 -1
), mas quando comprimir dois ou mais arquivos Quero ter arquivo com tamanho 13-15MB + N*0.3MB
, onde N é o número de arquivos.
Ao usar tar
(para criar 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
.
Eu acho que ambos gzip
e bzip2
não vão me ajudar porque eles têm dicionário com menos de 1 MB, e meu fluxo de tar tem repetições a cada 30 MB.
Como arquivar o meu problema no Linux moderno usando ferramentas padrão?
É possível ajustar xz
a compactação rapidamente, mas use um dicionário com mais de 30 a 60 MB?
Atualização : Fiz 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 o necessário mf=hc4
e as --memory=2G
opções; mas dict=128M
defina o dicionário para ser grande o suficiente (maior que um arquivo) e mode=fast
torne o processo um pouco mais rápido que -e
.
fonte
xz -1 --memory=2G
não ajudou, testada em 2 e 4 arquivos do conjunto.Respostas:
Dado seus detalhes, presumo que você tenha verificado que seus arquivos realmente têm 99% dos dados em comum, com uma diferença contígua (ou quase contígua) de 1% deles.
Primeiro, você deve usar o tar para criar um arquivo com seus arquivos dentro dele. Para testes, eu criaria um .tar com 10 arquivos, tendo um tamanho de 300MB.
Em seguida, usando xz, você deve configurá-lo para que o dicionário seja maior que o tamanho de um arquivo. Como você não diz se possui restrições de memória, eu usaria xz -9. Não faz sentido não usar toda a memória disponível.
Eu também usaria a predefinição --extreme, para testar se isso faz diferença.
Tamanho do dicionário
Em uma documentação que eu tenho disponível - site - diz-se que o tamanho do dicionário é aproximadamente igual ao uso da memória do descompressor. E o parâmetro -1 significa um ditado de 1MiB, -6 significa 10 MiB (ou 8 MiB em outra parte do mesmo manual). É por isso que você não está obtendo nenhuma vantagem ao ordenar esses arquivos juntos. Usar o -9 tornaria o decompessor (e, portanto, o dicionário) com 64 MiB, e acho que é isso que você deseja.
Editar
Outra possibilidade seria usar outro compressor. Eu usaria o 7zip, mas tarria esses arquivos primeiro e depois os 7ziparia.
Dependendo do conteúdo dos arquivos, talvez você possa usar o 7zip com o método PPM-D (em vez de LZMA ou LZMA2, que é o padrão e o mesmo usado pelo xz)
Não é bom: Zip (dict = 32kB), Bzip (dict = 900 kB).
fonte
-1
ou-9
preset, mas especificardict=64MB
ordict=128MB
e setmode=fast
?xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G
eu era capaz de comprimir 250 arquivos (7,5 GB) para 18 MB arquivo tar.xz.Se eles forem realmente 99% semelhantes, como você diz, você poderá usar o bsdiff ou um algoritmo semelhante para calcular as diferenças entre os arquivos. A diferença é cumulativa (ou seja, cada arquivo difere um pouco mais do primeiro) ou a diferença entre dois arquivos é praticamente a mesma?
Se não for cumulativo, você poderá:
bsdiff
comparação do arquivo de linha de base com cada arquivo adicionalxz
nos resultados (a linha de base + as diferenças).O resultado deve ser muito menor do que apenas
xz
o arquivo inteiro.Você pode "reconstituir" os arquivos originais "aplicando" o diff na parte superior da linha de base para obter cada um dos outros arquivos.
fonte
bsdiff
algoritmo. De uma chance.tar c directory|xz --lzma2=dict=128M,mode=fast
e excluí os arquivos de entrada. Na verdade, meus arquivos de entrada eram texto, então eu posso usar diff em vez debsdiff
(que não está instalado no meu PC).Você (I) pode usar 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; o rzip usa bzip2 e lrzip usa xz (lzma) / ZPAQ:
O lrzip possui buffer maior e pode usar muitos algoritmos de compactação (muito rápido, rápido, bom e um dos melhores - ZPAQ) após a desduplicação:
Outra maneira é usar o programa bup - backup com desduplicação em nível de bloco / segmento, com base no git packfile:
fonte