Wir haben unsere Protokolldateien komprimiert, um Platz zu sparen. Normalerweise halten wir sie komprimiert und tun es einfach
gunzip -c file.gz | grep 'test'
um wichtige Informationen zu finden, aber wir fragen uns, ob es schneller ist, die Dateien unkomprimiert zu halten und dann den Grep durchzuführen.
cat file | grep 'test'
Es gab einige Diskussionen darüber, wie gzip funktioniert, wenn es sinnvoll wäre, wenn es in den Speicher eingelesen und entpackt wird, dann wäre das erste schneller, aber wenn nicht, wäre das zweite schneller. Weiß jemand, wie gzip Daten dekomprimiert?
compression
gzip
Ryan Detzel
quelle
quelle
Antworten:
Es wird immer schneller sein, die unkomprimierte Datei zu katzen, da damit kein Overhead verbunden ist. Selbst wenn Sie keine temporäre Datei schreiben, durchlaufen Sie die Dekomprimierungsbewegungen, die die CPU belasten. Wenn Sie häufig genug auf diese Dateien zugreifen, ist es wahrscheinlich besser, sie unkomprimiert zu lassen, wenn Sie über ausreichend Speicherplatz verfügen.
Das Speichern von Daten auf Standard-Out (gunzip -c, zcat usw.) löst jedoch kein Schreiben in eine temporäre Datei aus. Die Daten werden direkt an den
grep
Befehl weitergeleitet, der den unkomprimierten Stream als eigenen Standard behandelt.Der Wikipedia-Artikel zur LZ * -Codierung ist hier: http://en.wikipedia.org/wiki/LZ77_and_LZ78 .
quelle
cat
erzeugt einen logisch linearen Lesevorgang, während die Dekomprimierungsoption mehr zufällige Lesevorgänge erfordert, um den Algorithmus zu handhaben. Vor dem Dekomprimieren wird nicht unbedingt der gesamte Datensatz in den Speicher eingelesen.Wie immer geht nichts über die tatsächliche Messung.
Ihre Ergebnisse können variieren, aber auf meinem System, greppen eine bereits unkomprimierte Datei etwa ein Drittel , dass die Zeit nahm , Rohrleitungen
zcat
odergunzip
ingrep
tat. Das ist nicht überraschend.quelle
Sie können gzip auch durch lzo ersetzen, um die Leistung zu verbessern.
Die Verwendung von LZO kann die Arbeit beschleunigen (geringerer Aufwand für die Festplatteneingabe und geringer CPU-Overhead bei der Komprimierung).
quelle
gzip -dc | grep foo (oder gunzip -c) | grep foo schreibt in eine Pipe. Wie die Pipe implementiert wird, hängt von Ihrem Betriebssystem ab, bleibt jedoch im Allgemeinen im Speicher. Wie andere bereits betont haben, wird das Erfassen einer unkomprimierten Datei aufgrund der Zeit, die zum Dekomprimieren der komprimierten Daten benötigt wird, immer schneller sein. Die Verwendung eines anderen Komprimierungsprogramms kann die Leistung verbessern oder nicht. Sie können es immer messen.
quelle
Die Verwendung der Komprimierung kann tatsächlich zu einem schnelleren Durchsatz auf Datenträgern führen. Dies hängt jedoch von einer Reihe von Faktoren ab, einschließlich des verwendeten Komprimierungsalgorithmus und der Art der Daten, die Sie verschieben. ZFS beispielsweise stützt sich stark auf diese Annahme .
gzip dekomprimiert entweder die gesamte Datei in eine temporäre Datei und benennt sie am Ende um (Standard
gzip -d myfile.gz
) oder verwendet überhaupt keine temporäre Datei, um einige Blöcke komprimierter Daten gleichzeitig zu lesen und unkomprimierte Daten auf stdout (gzip -d -c...
) auszuspucken .Auf einem modernen System vermute ich, dass a
gunzip | grep
schneller sein könnte als das Entpacken einer unkomprimierten Datei. Andererseitsgunzip | grep
wird es immer gewinnen, eine Datei zu dekomprimieren und dann die unkomprimierte zu erfassen :)quelle
Abhängig von der Dateigröße: Wenn E / A dominiert, benötigt die CPU für die Dekomprimierung weniger Zeit als die Dateiübertragung. Ob E / A dominieren wird, hängt stark von der relativen Geschwindigkeit Ihrer CPU, Ihrer Speichersysteme und der Bandbreite zwischen ihnen ab.
Nebenbei
grep -Z
bemerktzgrep
ist aka auch praktisch.quelle
grep -Z
undzgrep
sind zwei verschiedene Dinge. Die-Z
Optionen drucken nach gefundenen Dateien ein Null-Byte.zgrep
wirdgrep
für Dateien ausgeführt, die komprimiert werden können.