Ich frage nach einem Szenario zum Kopieren einer großen Datei auf einen Remote-Server.
Der einfachste Fall ist:
tar c myfile | ssh myserver tar x
Wenn die Netzwerkverbindung schnell ist, ist alles in Ordnung.
In einem langsameren Netzwerk
tar c myfile | bzip2 -1 | ssh myserver tar xj
-- beschleunigt meine Übertragung auf Kosten der CPU-Zeit.
Natürlich kann ich mit der Komprimierungsrate experimentieren und normalerweise versuchen, die richtige zu erraten, damit meine CPU nicht zu sehr ausgelastet ist und das Netzwerk überlastet wird.
Gibt es ein Komprimierungsprogramm oder ein Komprimierungsflag, das bzip2
/ xz
/... anweist, so viel wie möglich zu komprimieren, während der Ausgabepuffer belegt ist?
Antwort1
zstd --adapt
Derzstd
Komprimierungsprogrammhat eine Option, die adaptive Komprimierung einschaltet (die Option wurde in zstd
v1.3.6 hinzugefügt). Dadurch wird die Komprimierung an „die aktuell wahrgenommenen E/A-Bedingungen“ angepasst.
zstd
Weitere Informationen finden Sie im Handbuch.
Eine vollständige Pipeline könnte etwa wie folgt aussehen:
tar -c -f - source_directory |
zstd --adapt |
ssh user@server 'cd /someplace && { zstd -d | tar -x -f -;}'
oder
tar -c -f - source_directory |
zstd --adapt |
ssh user@server 'zstd -d | tar -x -C /someplace -f -'
Wenn Sie -v
zum ersten zstd
in der Pipeline hinzufügen, erhalten Sie eine Fortschrittsanzeige mit einem Text wie
(L7) Buffered : 32 MB - Consumed : 192 MB - Compressed : 72 MB => 37.50%
wobei der (L7)
den Komprimierungsgrad angibt. Bei jeder mäßig großen Datenmenge würde man erwarten, dass sie im Laufe der Zeit schwankt, was zeigt, dass zstd
sie sich tatsächlich an die E/A-Bedingungen (und vermutlich auch an die Daten selbst) anpasst.