Eu tenho que compactar vários arquivos muito grandes (80 GB ish) e estou surpreso com a (falta de) velocidade que meu sistema está exibindo. Eu recebo cerca de 500 MB / min de velocidade de conversão; usando top
, parece que estou usando uma única CPU em aproximadamente 100%.
Tenho certeza de que não é (apenas) a velocidade de acesso ao disco, pois a criação de um tar
arquivo (foi assim que o arquivo 80G foi criado) levou apenas alguns minutos (talvez 5 ou 10), mas depois de mais de 2 horas meu comando gzip simples ainda está não realizado.
Em suma:
tar -cvf myStuff.tar myDir/*
Levou <5 minutos para criar um arquivo tar de 87 G
gzip myStuff.tar
Levou duas horas e 10 minutos, criando um arquivo zip 55G.
Minha pergunta: isso é normal? Existem certas opções gzip
para acelerar as coisas? Seria mais rápido concatenar os comandos e usar tar -cvfz
? Vi referências a pigz
- Implementação Paralela do GZip - mas infelizmente não consigo instalar o software na máquina que estou usando, portanto isso não é uma opção para mim. Veja, por exemplo, esta pergunta anterior .
Pretendo tentar algumas dessas opções e cronometrá-las - mas é bem provável que não atinja "a combinação mágica" de opções. Espero que alguém neste site conheça o truque certo para acelerar as coisas.
Quando tiver os resultados de outros estudos disponíveis, atualizarei esta pergunta - mas se alguém tiver um truque particularmente bom disponível, eu realmente aprecio isso. Talvez o gzip leve mais tempo de processamento do que eu imaginava ...
ATUALIZAR
Conforme prometido, tentei os truques sugeridos abaixo: altere a quantidade de compactação e o destino do arquivo. Obtive os seguintes resultados para um alcatrão de cerca de 4,1 GB:
flag user system size sameDisk
-1 189.77s 13.64s 2.786G +7.2s
-2 197.20s 12.88s 2.776G +3.4s
-3 207.03s 10.49s 2.739G +1.2s
-4 223.28s 13.73s 2.735G +0.9s
-5 237.79s 9.28s 2.704G -0.4s
-6 271.69s 14.56s 2.700G +1.4s
-7 307.70s 10.97s 2.699G +0.9s
-8 528.66s 10.51s 2.698G -6.3s
-9 722.61s 12.24s 2.698G -4.0s
Então, sim, alterar o sinalizador do padrão -6
para o mais rápido -1
me dá uma aceleração de 30%, com (para os meus dados) praticamente nenhuma alteração no tamanho do arquivo zip. Se eu estou usando o mesmo disco ou outro não faz essencialmente nenhuma diferença (eu precisaria executar isso várias vezes para obter alguma significância estatística).
Se alguém estiver interessado, gerei esses benchmarks de tempo usando os dois scripts a seguir:
#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile
for i in {1..9}
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done
E o segundo script ( compressWith
):
#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz
Três coisas a serem observadas:
- Usando em
/usr/bin/time
vez detime
, já que o comando interno debash
tem muito menos opções que o comando GNU - Não me incomodei em usar a
--format
opção, embora isso facilite a leitura do arquivo de log - Eu usei um script em um script, pois
time
parecia operar apenas no primeiro comando em uma sequência canalizada (então, fiz com que parecesse um único comando ...).
Com tudo isso aprendido, minhas conclusões são
- Acelere as coisas com a
-1
bandeira (resposta aceita) - É gasto muito mais tempo compactando os dados do que lendo no disco
- Invista em um software de compactação mais rápido (
pigz
parece ser uma boa escolha). - Se você tiver vários arquivos para compactar, poderá colocar cada
gzip
comando em seu próprio encadeamento e usar mais da CPU disponível (homem pobrepigz
)
Obrigado a todos que me ajudaram a aprender tudo isso!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
mostrará a rapidez com que sua máquina está compactando o material. side-note2: armazene o resultado em um disco diferente.
man
página e não li até agora (porque é classificada por 'comando de letra única', que é -#
) . Isso vai me ensinar a RTFM! Esta será a próxima coisa que eu tento!
pigz
e executá-lo de onde quer que o tenha construído, sem instalá-lo. Se não houver um compilador, você poderá compilá-lo em outro computador, embora isso esteja começando a se esforçar mais do que vale a pena. (Dependendo de quão mal você precisa esta compressão para correr mais rápido, eu acho.)