Funktioniert gunzip im Speicher oder schreibt es auf die Festplatte?

7

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?

Ryan Detzel
quelle
1
In Ihrem zweiten Beispiel ist eine nutzlose Verwendung von Katze. grep verwendet einen Dateinamen als Argument.
Nathan Powell

Antworten:

4

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 grepBefehl 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 .

McJeff
quelle
1
Es ist jetzt üblich, dass das E / A der langsame Teil der Maschine ist. Die Idee hinter Gunzip ist also, dass es schneller (komprimiert) die Daten von der Festplatte lesen kann, wenn man sie mit der CPU dekomprimiert, von der es reichlich gibt. Sinn machen, warum funktioniert das nicht?
Ryan Detzel
Zusätzlich zu dem, was ich oben gesagt habe: Wenn die komprimierte Datei 1 GB und die unkomprimierte 3 GB groß ist, ist die Theorie, dass es viel schneller ist, die komprimierte Datei einzulesen und CPU-Zeit zu verschwenden, als die 3 GB-Datei von der Festplatte zu lesen.
Ryan Detzel
IO war fast immer das langsame Stück. Die Standard Von Neumann Design Box passt in diese Kategorie. Ich weiß nicht genug über den zugrunde liegenden Komprimierungsalgorithmus, um das definitiv zu beantworten, aber meine Vermutung? Das Ausführen von a caterzeugt 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.
McJeff
3

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 zcatoder gunzipin greptat. Das ist nicht überraschend.

Bis auf weiteres angehalten.
quelle
1

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).

Vi.
quelle
1

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.

Rob Shinn
quelle
1

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 | grepschneller sein könnte als das Entpacken einer unkomprimierten Datei. Andererseits gunzip | grepwird es immer gewinnen, eine Datei zu dekomprimieren und dann die unkomprimierte zu erfassen :)

Luke404
quelle
0

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 -Zbemerkt zgrepist aka auch praktisch.

pjz
quelle
Nur ein Hinweis , dass auf meiner Plattform, grep -Zund zgrepsind zwei verschiedene Dinge. Die -ZOptionen drucken nach gefundenen Dateien ein Null-Byte. zgrepwird grepfür Dateien ausgeführt, die komprimiert werden können.
Michael Mior