Mi ritrovo a dover comprimere un numero di file molto grandi (80-ish GB) e sono sorpreso dalla (mancanza di) velocità che il mio sistema sta esibendo. Ottengo una velocità di conversione di circa 500 MB / min; usando top
, mi sembra di usare una singola CPU a circa il 100%.
Sono abbastanza sicuro che non sia (solo) la velocità di accesso al disco, poiché la creazione di un tar
file (è così che è stato creato il file 80G) ha richiesto solo pochi minuti (forse 5 o 10), ma dopo più di 2 ore il mio semplice comando gzip è ancora non fatto.
In sintesi:
tar -cvf myStuff.tar myDir/*
Sono stati necessari <5 minuti per creare un file tar da 87 G
gzip myStuff.tar
Ci sono voluti due ore e 10 minuti, creando un file zip 55G.
La mia domanda: è normale? Ci sono alcune opzioni gzip
per accelerare le cose? Sarebbe più veloce concatenare i comandi e utilizzarli tar -cvfz
? Ho visto riferimento a pigz
- Implementazione parallela di GZip - ma sfortunatamente non riesco a installare il software sulla macchina che sto usando, quindi non è un'opzione per me. Vedi ad esempio questa domanda precedente .
Ho intenzione di provare alcune di queste opzioni da solo e cronometrarle - ma è molto probabile che non colpirò "la combinazione magica" di opzioni. Spero che qualcuno su questo sito conosca il trucco giusto per accelerare le cose.
Quando avrò i risultati di altre prove disponibili, aggiornerò questa domanda, ma se qualcuno ha un trucco particolarmente utile disponibile, lo apprezzerei molto. Forse il gzip richiede solo più tempo di elaborazione di quanto pensassi ...
AGGIORNARE
Come promesso, ho provato i trucchi suggeriti di seguito: modificare la quantità di compressione e cambiare la destinazione del file. Ho ottenuto i seguenti risultati per un tar che era di circa 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
Quindi sì, cambiando il flag dal default -6
al più veloce -1
mi dà uno speedup del 30%, con (per i miei dati) quasi nessuna modifica alle dimensioni del file zip. Che io stia usando lo stesso disco o un altro non fa praticamente alcuna differenza (dovrei eseguirlo più volte per ottenere un significato statistico).
Se qualcuno è interessato, ho generato questi benchmark di temporizzazione usando i seguenti due script:
#!/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 il secondo 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
Tre cose da notare:
- Usando
/usr/bin/time
piuttosto chetime
, dato che il comando integrato dibash
ha molte meno opzioni rispetto al comando GNU - Non mi sono preoccupato di usare l'
--format
opzione, anche se ciò renderebbe più facile la lettura del file di registro - Ho usato uno script-in-a-script poiché
time
sembrava funzionare solo sul primo comando in una sequenza convogliata (quindi l'ho fatto sembrare un singolo comando ...).
Con tutto ciò appreso, le mie conclusioni sono
- Accelera le cose con la
-1
bandiera (risposta accettata) - Passa molto più tempo a comprimere i dati che a leggere dal disco
- Investi in un software di compressione più veloce (
pigz
sembra una buona scelta). - Se hai più file da comprimere puoi mettere ogni
gzip
comando nel suo thread e usare più della CPU disponibile (poveropigz
)
Grazie a tutti coloro che mi hanno aiutato a imparare tutto questo!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
ti mostrerà quanto velocemente la tua macchina sta comprimendo le cose. side-note2: memorizza il risultato su un altro disco.
man
pagina e non ho letto così lontano (perché è ordinata per 'comando a lettera singola', che è -#
) . Questo mi insegnerà a RTFM! Questa sarà la prossima cosa che proverò!
pigz
ed eseguirlo da qualsiasi luogo in cui sia stato creato, senza installarlo. Se non esiste un compilatore, è possibile compilarlo in modo incrociato su un altro computer, anche se questo sta iniziando a fare più sforzo di quanto potrebbe valerne la pena. (A seconda di quanto sia necessaria questa compressione per funzionare più velocemente, immagino.)