256
Deutsch   Englisch
img

Schnelle verlustfreie Kompression von Zahlen, die als Text gespeichert sind

Wenn große Datenmengen bei maximaler Geschwindigkeit und gleichzeitig guter Kompression gelesen und geschrieben werden sollen, empfiehlt sich meist ein speziell auf das Problem zugeschnittener Algorithmus (siehe fc16). Für einige Anwendungsfälle ist es allerdings vorteilhaft, wenn die Daten von textbasierten Programmen gelesen werden können, z.B. von grep, sed oder awk.

fc4 (fast compression 4 bit)

Da als Text codierte Zahlen im Mittel etwas mehr als das Doppelte an Speicherplatz belegen als binär gespeicherte Zahlen, sollten große Datenmengen vor dem Schreiben auf die Festplatte komprimiert werden. Das Programm fc4 von 256.systems komprimiert Dateien, die hauptsächlich Zahlen im ASCII-Format enthalten, mit über 4 GB/s pro Rechenkern und dekomprimiert sie mit 8 GB/s pro Rechenkern (auf einem Notebook mit Intel i5 Prozessor). Dabei werden ähnliche Kompressionsraten wie bei gzip, lzma und zstd erreicht.

Benchmark 1: Kompressions- und Dekompressionsgeschwindigkeiten von verschiedenen Programmen

img
Links: Kompressionsgeschwindigkeit von gzip, lzma, zstd und fc4 für verschiedene Arten von Zahlen, die als ASCII-Text gespeichert sind.
Rechts: Dekompressionsgeschwindigkeit.

Benchmark 2: Kompressionsrate und Gesamtperformance von verschiedenen Programmen

img
Links: Kompressionsrate von gzip, lzma, zstd und fc4 für verschiedene Arten von Zahlen, die als ASCII-Text gespeichert sind.
Rechts: Kombinierte Kompressions- und Dekompressionsgeschwindigkeit v = (v_c+v_d)/(2*ratio) ; v ist hier also der Mittelwert von Kompressions- und Dekompressionsgeschwindigkeit geteilt durch die Kompressionsrate und gibt somit den mittleren Lese- und Schreibdurchsatz der unkomprimierten Daten an.

Schnelle Konversion von Text zu Zahlen und zurück

Möchte man Zahlen als Text speichern, muss man sie vom Binärformat ins Dezimal- und dann ins ASCII-Format umwandeln. Unter Linux gibt es dafür in der Standard-Library die verschiedenen printf-Funktionen.

Um Zahlen aus Textdateien wieder zurück ins Binärformat umzuwandeln, gibt es atoi (ASCII to 32 bit integer), atol (ASCII to 64 bit integer) und atof (ASCII to 64 bit float). Obwohl diese Funktionen stark optimiert sind, können sie in vielen Fällen zum Flaschenhals des aufrufenden Programmes werden.

256.systems stellt die Funktionen fatoi, fatof, print_int und demnächst auch print_float bereit, die 4 bis 6 mal schneller als die Funktionen der Standard-Library sind (siehe Benchmark-Ergebnisse unten).

Benchmark: Konversion von Zahlen: Textformat --> Binärformat; C Standard Library vs. fc4

img
Linke Grafik: Anzahl der Umwandlungen pro Sekunde von ASCII-Text in 32 bit integer (links), 64 bit integer (mitte) und 64 bit floats (rechts).
Rechte Grafik: wie linke Grafik, jedoch wird hier die Menge an umgewandeltem ASCII-Text in MegaBytes pro Sekunde gezeigt.

Benchmark: Konversion von Zahlen: Binärformat --> Textformat: C Standard Library vs. fc4

img
Linke Grafik: Anzahl der Umwandlungen pro Sekunde von 32 bit integer (links) und 64 bit integer (rechts) in ASCII-Text. Rechte Grafik: wie linke Grafik, jedoch wird hier die Menge an umgewandeltem ASCII-Text in MegaBytes pro Sekunde gezeigt.

Kontakt

Für Anfragen zu ASCII-Zahlen-Kompression, schnellen Konversionsroutinen und ähnlichen Algorithmen steht 256.systems zur Verfügung.