Nadel im Datenhaufen
Suche in komprimierten Dateien und Archiven
Geschwindigkeit
An dieser Stelle erhebt sich die spannende Frage nach der Trefferquote und der Zeit, nach der das Suchergebnis feststeht. Obwohl für bestimmte Formate spezielle Werkzeuge existieren, arbeiten diese nicht automatisch besser – die Standard-Tools sind vielfach bis ins letzte Quäntchen optimiert.
Für einen Vergleich mit halbwegs plausiblen Werten stand im Test eine Datei mit 12 MByte ASCII-Text bereit. Diese wurde mit den jeweiligen Programmen komprimiert und dann darin gesucht – einmal über die Standardausgabe und einmal mit den formatspezifischen Suchprogrammen. Die Tabelle "Tools im Test" zeigt die ermittelten Werte, Abbildung 6 stellt diese grafisch gegenüber.
Tools im Test
| Methode | Kommandoaufruf | Zeit (real) | Zeit (user) | Zeit (sys) |
|---|---|---|---|---|
| Unkomprimiert | time grep --color -E "[Pp]reis.+pdf" testliste
|
0,040s | 0,024s | 0,016s |
| Bzegrep | time bzegrep --color "[Pp]reis.+pdf" testliste.bz2
|
0,824s | 0,832s | 0,036s |
| Bzip2+Grep | time bzip2 -dc testliste.bz2 | grep --color -E "[Pp]reis.+pdf"
|
0,826s | 0,832s | 0,036s |
| Zegrep | time zegrep --color "[Pp]reis.+pdf" testliste.gz
|
0,189s | 0,196s | 0,024s |
| Gunzip+Grep | time gunzip -dc testliste.gz | grep --color -E "[Pp]reis.+pdf"
|
0,173s | 0,184s | 0,016s |
| Xzgrep | time xzgrep --color -E "[Pp]reis.+pdf" testliste.xz
|
0,113s | 0,100s | 0,044s |
| Xz+Grep | time xz -dc testliste.xz | grep --color -E "[Pp]reis.+pdf"
|
0,097s | 0,108s | 0,020s |
Vorneweg: Die Liste der Treffer war im Test bei allen Programmen identisch und vollständig. Hingegen zeigen sich bei den gemessenen Zeiten für den Mustervergleich starke Unterschiede: Für jedes Komprimierungsformat existiert ein spezifisches Zeitverhalten. Am wenigsten Zeit benötigt XZ, Bzip2 arbeitet hingegen am längsten.
Abbildung 6 stellt die gemessenen Zeiten bei der Suche in den Textdaten dar. Die erste Säule zeigt die Suche mit Grep auf den unkomprimierten Daten (12 MByte). Die nachfolgenden, jeweils benachbarten Säulen zeigen die Dauer für einen spezifischen Suchweg – Säule 2 und 3 für Bzip2 (1,8 MByte Daten), Säule 4 und 5 für Gzip (2,4 MByte) und Säule sechs und sieben für Xz (98 KByte).
Hier fällt auf, dass sich jeder Suche eine spezifische Dauer zuordnen lässt. Dabei liegt die Suche über die Standardausgabe stets in der gleichen Klasse wie das formatspezifische Programm.
Unter Berücksichtigung der Kompressionsstärke gebührt dem XZ-Format die Ehre des Siegers. Im Vergleich zu den anderen Werkzeugen komprimiert dieses Tool sehr stark. Da es nur 98 KByte an Daten von der Festplatte zu lesen braucht, verringert sich der Gesamtaufwand für die Suche. Das Auspacken und Durchsuchen geschieht vollständig im RAM und verursacht daher die geringste Verzögerung.
Fazit
Archive und komprimierte Daten zu durchsuchen gelingt relativ problemlos, sofern Sie die verschiedenen Werkzeuge geschickt miteinander kombinieren. Das setzt aber die genaue Kenntnis der jeweiligen Optionen und Parameter voraus. Nutzen Sie die speziellen Tools aus den Paketen der einzelnen Archiv- und Komprimierungsprogramme, verringert sich der Aufwand etwas. Qualitativ ließ sich im Vergleich zu den klassischen Shell-Kommandos kein Unterschied feststellen.
Die Unterschiede in Bezug auf die Geschwindigkeit treten bei größerern Datenmengen vermutlich noch deutlicher hervor. Ob das im Alltagsgebrauch eine wesentliche Rolle spielt, hängt im Einzelfall von den archivierten Daten und deren Mengen ab. Mit Ausnahme von Zipgrep erfüllt jedes der vorgestellten Werkzeuge die Erwartungen.
Welche Kommandosequenz Sie letztendlich im Alltag einsetzen, hat oft einen ganz profanen Grund – gibt es das Paket für die genutzte Distribution überhaupt, ist es auch installiert? Weiterhin spielen die Lesbarkeit eines Kommandos und die Bequemlichkeit des Anwenders einen großen Einfluß bei der Nutzung. Verkürzte Schreibweisen sparen Zeit bei der Eingabe und verringern die Fehlerrate beim Einsatz.
Für andere Dateiformate existieren ebenfalls Grep-ähnliche Werkzeuge, unter anderem für PDF-Dokumente (pdfgrep) [4], Audiodaten (taggrepper), Prozesslisten (pgrep) und Gnumeric-Rechenblätter (ssgrep). Eine erste Übersicht hat Axel Beckert in seinem Blog [5] zusammengetragen.
Danksagung
Die Autoren bedanken sich bei Maximilian Techter, Thomas Osterried und Thomas Winde für deren kritische Anmerkungen und Kommentare im Vorfeld dieses Artikels.
Infos
[1] Werkzeuge auf der Kommandozeile: http://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/weitere_kdozeilen_beispiele.html
[2] Unpack-Paket bei Debian: http://packages.debian.org/squeeze/unp
[3] Debian-Bug-Report zu Zipgrep: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=652838
[4] Suche in Postscript und PDF: Frank Hofmann, "Gesucht, gefunden", LU 02/2012, S. 82, http://www.linux-community.de/25255
[5] "Grep everything": http://noone.org/blog/English/Computer/Shell/grep%20everything.futile



