Ich muss einige sehr große Dateien komprimieren (80-ish GB), und ich bin überrascht über die (fehlende) Geschwindigkeit, die mein System aufweist. Ich erhalte eine Konvertierungsgeschwindigkeit von ca. 500 MB / min. Unter Verwendung von top
scheint ich eine einzelne CPU mit ungefähr 100% zu verwenden.
Ich bin mir ziemlich sicher, dass es nicht (nur) die Geschwindigkeit des Festplattenzugriffs ist, da das Erstellen einer tar
Datei (so wurde die 80G-Datei erstellt) nur wenige Minuten (vielleicht 5 oder 10) gedauert hat, aber nach mehr als 2 Stunden ist mein einfacher gzip-Befehl immer noch nicht durchgeführt.
Zusammenfassend:
tar -cvf myStuff.tar myDir/*
Es dauerte <5 Minuten, um eine 87-G-Teer-Datei zu erstellen
gzip myStuff.tar
Es dauerte zwei Stunden und 10 Minuten, um eine 55G-Zip-Datei zu erstellen.
Meine Frage: Ist das normal? Gibt es bestimmte Möglichkeiten gzip
, die Dinge zu beschleunigen? Wäre es schneller, die Befehle zu verketten und zu verwenden tar -cvfz
? Ich sah Bezug auf pigz
- parallele Implementierung von GZIP - aber leider kann ich keine Software auf dem Rechner installieren Ich verwende, so dass für mich keine Option ist. Siehe zum Beispiel diese frühere Frage .
Ich beabsichtige, einige dieser Optionen selbst auszuprobieren und zu testen - aber es ist sehr wahrscheinlich, dass ich nicht die "magische Kombination" von Optionen treffen werde. Ich hoffe, dass jemand auf dieser Seite den richtigen Trick kennt, um die Dinge zu beschleunigen.
Wenn ich die Ergebnisse anderer Versuche zur Verfügung habe, werde ich diese Frage aktualisieren - aber wenn jemand einen besonders guten Trick zur Verfügung hat, würde ich es wirklich begrüßen. Vielleicht braucht der gzip einfach mehr Verarbeitungszeit, als mir klar wurde ...
AKTUALISIEREN
Wie versprochen habe ich die folgenden Tricks ausprobiert: Ändern Sie den Komprimierungsgrad und das Ziel der Datei. Ich habe die folgenden Ergebnisse für einen Teer erhalten, der ungefähr 4,1 GB groß war:
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
Wenn ich also das Flag vom Standard -6
zum schnellsten -1
ändere, habe ich eine 30% ige Beschleunigung, wobei sich (für meine Daten) kaum etwas an der Größe der ZIP-Datei ändert. Ob ich dieselbe oder eine andere Festplatte verwende, spielt im Wesentlichen keine Rolle (ich müsste dies mehrere Male ausführen, um statistische Signifikanz zu erhalten).
Bei Interesse habe ich diese Timing-Benchmarks mit den folgenden beiden Skripten generiert:
#!/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
Und das zweite Skript ( 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
Drei Dinge zu beachten:
- Verwenden
/usr/bin/time
statttime
, da der eingebaute Befehl vonbash
viel weniger Optionen hat als der GNU-Befehl - Ich habe mich nicht darum gekümmert, die
--format
Option zu verwenden, obwohl dies die Lesbarkeit der Protokolldatei verbessern würde - Ich habe ein Skript-in-einem-Skript verwendet, da
time
es nur beim ersten Befehl in einer Pipe-Sequenz zu funktionieren schien (also habe ich es wie einen einzelnen Befehl aussehen lassen ...).
Nach all diesen Erkenntnissen sind meine Schlussfolgerungen
- Beschleunigen Sie die Dinge mit der
-1
Flagge (akzeptierte Antwort) - Das Komprimieren der Daten kostet viel mehr Zeit als das Lesen von der Festplatte
- Investieren Sie in eine schnellere Komprimierungssoftware (
pigz
scheint eine gute Wahl zu sein). - Wenn Sie mehrere Dateien zum Komprimieren haben, können Sie jeden
gzip
Befehl in einen eigenen Thread stellen und mehr von der verfügbaren CPU (dem armen Mannpigz
) verwenden.
Vielen Dank an alle, die mir geholfen haben, das alles zu lernen!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
Zeigt an, wie schnell Ihre Maschine das Material komprimiert. Randnotiz2: Speichern Sie das Ergebnis auf einer anderen Disc.
man
Seite, und ich habe sie nicht so weit gelesen (weil sie nach "Einzelbuchstaben-Befehl" sortiert ist -#
). . Das bringt mir RTFM bei! Dies wird das nächste sein, was ich versuche!
pigz
ihn von jedem Ort aus kompilieren und ausführen, an dem Sie ihn erstellt haben, ohne ihn zu installieren. Wenn es keinen Compiler gibt, können Sie ihn auf einem anderen Computer übergreifend kompilieren, obwohl dies mehr Aufwand verursacht, als es möglicherweise wert ist. (Je nachdem, wie dringend Sie diese Komprimierung benötigen, um schneller zu laufen, denke ich.)