Alcuni programmi di compressione possono mostrare informazioni (come il rapporto di compressione o i totali di tempo e dimensione) durante l'esecuzione dell'attività, come xz -v
:
--- % 2,580.2 KiB / 6,552.0 KiB = 0.394 1.2 MiB/s 0:05
Durante la compressione di un file di grandi dimensioni, vorrei conoscere il rapporto di compressione a metà dell'attività, in modo da poter interrompere il processo se il rapporto di compressione è basso e lasciarlo non compresso.
Ci sono altri programmi con questa funzione? (xz
ha un alto rapporto di compressione ma è lento)
Risposta accettata:
Il modo generico per farlo è usare qualcosa come pv
per monitorare sia la dimensione di input che quella di output del programma di compressione. Ad esempio :
$ pv -cpterba -N in /dev/urandom | gzip | pv -cpterba -N out > /dev/null
out: 956MiB 0:00:42 [23.1MiB/s] [22.8MiB/s] [ <=> ]
in: 956MiB 0:00:42 [23.1MiB/s] [22.8MiB/s] [ <=> ]
È abbastanza facile vedere sopra che la dimensione dell'output è la stessa della dimensione dell'input, come previsto quando si tenta di comprimere dati casuali.
Se invece proviamo un file che si comprime davvero bene:
$ pv -cpterba -N in /dev/zero | gzip | pv -cpterba -N out > /dev/null
out: 2.62MiB 0:00:25 [ 109KiB/s] [ 107KiB/s] [ <=> ]
in: 2.65GiB 0:00:25 [ 110MiB/s] [ 108MiB/s] [ <=> ]
La dimensione dell'output è 2,62 MiB, l'input è 2,65 GiB:3 ordini di grandezza più grandi.
Come vantaggio collaterale, se utilizzato su un file normale, pv
ti darà un ETA:
$ pv -cpterba -N in debian-8.2.0-amd64-DVD-1.iso | gzip | pv -cpterba -N out > /dev/null
out: 578MiB 0:00:27 [22.1MiB/s] [21.4MiB/s] [ <=> ]
in: 595MiB 0:00:27 [22.1MiB/s] [ 22MiB/s] [==> ] 15% ETA 0:02:25
L'immagine del DVD di Jessie è composta principalmente da file compressi, quindi non si comprime molto bene, ma ci vorrebbero altri due minuti e mezzo per essere completata.
Puoi anche usare pv -d
per monitorare un processo già in esecuzione:se lo applichi a un compressore in esecuzione, ti dirà dove si trova nel file di input rispetto al file di output, permettendoti di nuovo di vedere rapidamente il rapporto:
$ pv -pterba -d "$(pidof gzip)"
3:/var/tmp/mp3s.tar: 911MiB 0:00:44 [ 20MiB/s] [19.9MiB/s] [> ] 9% ETA 0:07:35
4:/var/tmp/mp3s.tar.gz: 906MiB 0:00:44 [ 20MiB/s] [19.8MiB/s] [ <=> ]
Neanche i file tar degli MP3 si comprimono bene.
Nota: Molti compressori funzionano blocco per blocco. Ecco perché potresti vedere cose come il picco della velocità di trasferimento che poi è 0, ripeti. È necessario far funzionare il compressore per un po' prima di poter avere un'idea reale del rapporto atteso. Tieni presente che subito dopo un picco, probabilmente viene letto in un blocco, ma non ancora scritto la versione compressa, ma se hai già aspettato per 10 blocchi, si tratta al massimo di un errore del 10%.
Correlati:cosa fa un programma quando riceve il segnale SIGKILL?
(Le opzioni pv che sto usando:-p
per attivare la barra di avanzamento; -t
per attivare il tempo trascorso; -e
attivare l'ETA; -r
per mostrare la velocità di trasferimento; -b
per attivare il contatore di byte; -c
per creare più pv
s in una conduttura; -N
per impostare le etichette).