Konto_check

Bibliothek zum Test deutscher Bankkonten

Überblick Testseite Download BLZ-Daten Beispiele Programme
Konto_check BLZ-DatenKompression

Bibliothek zum Test deutscher Bankkonten

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.