Vergleich verschiedener Kompressionsbibliotheken für die LUT-Datei
Die konto_check Bibliothek wurde außer mit zlib noch mit den
Kompressions-Bibliotheken bzip2, lzo und lzma sowie ohne Kompression getestet.
Der Vergleich zwischen den Bibliotheken beinhaltete die Größe der erzeugten
LUT-Datei, die Initialisierungszeit mit allen Blocks einer kompletten LUT-Datei
(inklusive Filialen; gemessen unter C), sowie der Hauptspeicherbedarf für den
Aufruf "./konto_check -d blz.lut2"
; bei diesem Aufruf wird die
LUT-Datei komplett gelesen, aber ansonsten nichts gemacht.
Bei der Konzeption des lut2 Formates wurde darauf geachtet, daß in den großen Blocks (v.a. Name und Kurzname) ähnliche Daten auch in der Datei nahe zusammenstehen; daher ist die Kompression durch die zlib schon sehr gut. Hauptspeicherverbrauch und Initialisierungszeit sind etwas größer als ohne Kompression, aber die Unterschiede sind nur marginal (20 ms Initialisierung gegenüber 16 ms, 1,7 MB Hauptspeicher gegenüber 1,3 MB); die Dateigröße ist allerdings nur 1/4 bis 1/5 der ungepackten Größe, je nach Inhalt der LUT-Datei.
lzo (in der Version minilzo) ist bzgl. Initialisierungszeit und (Haupt-) Speicherverbrauch mit gzip vergleichbar; die LUT-Datei ist allerdings einiges größer (391K gegenüber 264K bei gzip). Allerdings hat die Bibliothek den großen Nachteil, daß sie unter der GPL verbreitet wird, nicht wie konto_check unter der LGPL. Daher müssen auch alle Programme, die die lzo-Bibliothek benutzen, ebenfalls GPL-lizensiert werden. Für kommerzielle Anwendungen gibt es auf Anfrage auch Lizenzen; da aber mit der zlib eine Bibliothek zur Verfügung steht, die (bei noch besserer Gesamtleistung) kostenfrei beliebig komerziell benutzt werden kann, ist lzo keine Alternative.
bzip2 ergibt eine kleine Verbesserung (allerdings nicht sehr viel: 252K im Vergleich zu 264K, bzw. eine Kompression von 19,8% gegenüber 20,8% bei zlib); allerdings ist der Algorithmus beim Entpacken wesentlich langsamer (66 ms Initialisierung statt 20 ms bei zlib), so daß der kleine Vorteil in der Dateigröße irrelevant wird. Außerdem ist der Hauptspeicherbedarf beim Entpacken von bzip2 wesentlich größer (28MB gegenüber 1,7MB bei zlib für die Initialisierung mit allen Blöcken), was für Server-Anwendungen nicht wünschenswert ist.
lzma bietet eine hervorragende Kompression (es wird noch ein guter Teil herausgequetscht); allerdings wird für die Entkomprimierung sehr viel Hauptspeicher benötigt. Der Minimalwert, der unbedingt benötigt wird (mit weniger Speicher kommt nur eine Fehlermeldung zurück), liegt bei etwa 67MB; die konto_check Bibliothek wird mit einem Wert von 70 MB kompiliert. Dies ist der Wert, der bei jedem Entkomprimieren benötigt wird; selbst für den Infoblock (mit 517 Byte ungepackt) wird so viel Speicher angefordert. Deshalb ist dieses (ansonsten interessante) Verfahren für konto_check, das ja auch z.B. im Kontext eines Webservers laufen soll, unbrauchbar. Für die Komplett-Initialisierung wird bei lzma insgesamt 830 MB Hauptspeicher allokiert.
Das bestes Packprogramm in der Gesamtwertung (dazu noch mit durchaus guten Werten bzgl. Geschwindigkeit und Packrate) ist die zlib Bibliothek. Der Glue Code für die anderen Pakete ist zwar in konto_check noch enthalten, sie sind im makefile allerdings auskommentiert.
Zur Installation: Falls eine der Bibliotheken eingebunden werden soll, müssen bzip2 und lzma normal in den Systemverzeichnissen installiert werden (oder die Pfade entsprechend gesetzt werden). Für lzo wurde nicht die große Distribution verwendet, sondern minilzo; die Datei minilzo.c und die drei Headerdateien dieser Version müssen ins Hauptverzeichnis von konto_check kopiert werden, dann werden sie direkt per #include eingebunden.
Hier noch eine kurze Übersicht zu den Dateigrößen, Initialisierungszeiten und Hauptspeicherbedarf:
Kompression der Blocks einer LUT-Datei ohne Filialen:
Inhalt | raw | zlib | Verh. | lzo | Verh. | bzip2 | Verh. | lzma | Verh. |
---|---|---|---|---|---|---|---|---|---|
Infoblock | 517 | 375 | 72.4% | 482 | 93.2% | 424 | 81.7% | 456 | 88.0% |
BLZ | 9292 | 7033 | 75.7% | 8794 | 94.6% | 7426 | 79.9% | 6928 | 74.6% |
Pruefziffer | 4156 | 1654 | 39.8% | 2524 | 60.7% | 1902 | 45.8% | 1728 | 41.6% |
Name/Kurzn. | 199224 | 37655 | 18.9% | 61687 | 31.0% | 33851 | 17.0% | 33328 | 16.7% |
Plz | 12468 | 8206 | 65.8% | 10713 | 85.9% | 8946 | 71.8% | 6460 | 51.8% |
Ort | 53102 | 12286 | 23.1% | 18103 | 34.1% | 11652 | 21.9% | 11536 | 21.7% |
BIC | 37276 | 13069 | 35.1% | 19568 | 52.5% | 12096 | 32.4% | 10440 | 28.0% |
Nachf.BLZ | 16624 | 676 | 4.1% | 1088 | 6.5% | 812 | 4.9% | 724 | 4.4% |
Aenderung | 4156 | 194 | 4.7% | 441 | 10.6% | 232 | 5.6% | 268 | 6.4% |
Gesamt | 336815 | 81148 | 24.1% | 123400 | 36.6% | 77341 | 23.0% | 71868 | 21.3% |
Vollständige LUT-Datei mit Filialen:
Inhalt | raw | zlib | Verh. | lzo | Verh. | bzip2 | Verh. | lzma | Verh. |
---|---|---|---|---|---|---|---|---|---|
Infoblock | 547 | 401 | 73.4% | 516 | 94.7% | 438 | 80.1% | 484 | 88.6% |
BLZ | 9292 | 7033 | 75.7% | 8793 | 94.6% | 7426 | 79.9% | 6928 | 74.6% |
Pruefziffer | 4156 | 1654 | 39.8% | 2524 | 60.7% | 1902 | 45.8% | 1728 | 41.6% |
Anzahl Fil. | 4156 | 1913 | 46.0% | 2921 | 70.3% | 2000 | 48.1% | 1832 | 44.1% |
Name/Kurzn. | 645542 | 74399 | 11.5% | 121573 | 18.8% | 71167 | 11.0% | 63296 | 9.8% |
Plz | 59547 | 37138 | 62.4% | 48622 | 81.7% | 37854 | 63.6% | 28804 | 48.4% |
Ort | 272053 | 66674 | 24.5% | 101309 | 37.2% | 61345 | 22.5% | 59804 | 22.0% |
BIC | 67457 | 19949 | 29.6% | 31158 | 46.2% | 18160 | 26.9% | 15760 | 23.4% |
Nachf.BLZ | 79396 | 847 | 1.1% | 1403 | 1.8% | 891 | 1.1% | 892 | 1.1% |
Aenderung | 19849 | 378 | 1.9% | 920 | 4.6% | 408 | 2.1% | 512 | 2.6% |
Loeschung | 19849 | 362 | 1.8% | 1153 | 5.8% | 379 | 1.9% | 540 | 2.7% |
PAN | 59547 | 13567 | 22.8% | 20506 | 34.4% | 16905 | 28.4% | 11980 | 20.1% |
Lfd. Nr. | 59547 | 45693 | 76.7% | 59891 | 100.6% | 38719 | 65.0% | 31264 | 52.5% |
Gesamt | 1300938 | 271074 | 20.8% | 401289 | 30.9% | 258661 | 19.8% | 224890 | 17.2% |
Vergleich von Initialisierungszeiten und Speicherbedarf mit vollständiger LUT-Datei
Der Speicherbedarf wurde mittels valgrind --leak-check=full ./konto_check -d blz.lut2
ermittelt.
Bibliothek | Zeit | Hauptspeicherbedarf (Ausgabe von valgrind) |
---|---|---|
ohne Kompr. | 16 ms | 16 allocs, 16 frees, 1,314,910 bytes allocated |
gzip | 20 ms | 42 allocs, 42 frees, 1,708,675 bytes allocated |
LZO | 19 ms | 29 allocs, 29 frees, 1,716,196 bytes allocated |
bzip2 | 66 ms | 55 allocs, 55 frees, 28,406,012 bytes allocated |
LZMA | 49 ms | 133 allocs, 133 frees, 874,403,349 bytes allocated |
Falls man kurze Initialisierungszeit benötigt (oder möglichst wenig Hauptspeicher), ist die Version ohne Komprimierung vorzuziehen. Die LUT-Datei wird dabei zwar ziemlig groß (gut 1,2 MB), aber der Speicherplatz stellt heute ja kein großes Problem mehr dar. Durch die Organisation der LUT-Datei in Blocks, die unabhängig voneinander gelesen werden, muß zur Initialisierung auch nicht die komplette Datei eingelesen werden, sondern nur die Blocks, die man benötigt.