Hier sind fünf Wege mit gzip, drei brauchen einen Index, zwei nicht.
Es ist möglich, einen Index für jede gzip-Datei zu erstellen, d. H. Nicht speziell konstruiert, wie von zran.c getan. Dann können Sie die Dekompression an Blockgrenzen beginnen. Der Index enthält die 32 KB des unkomprimierten Datenverlaufs an jedem Eingangspunkt.
Wenn Sie die gzip-Datei erstellen, kann sie mit periodischen Einstiegspunkten erstellt werden, deren Index an diesen Einstiegspunkten keine unkomprimierte Historie benötigt, was zu einem kleineren Index führt. Dies geschieht mit der Z_FULL_FLUSH
Option zu deflate()
in zlib.
Sie könnten auch einen Z_SYNC_FLUSH
gefolgt von einem Z_FULL_FLUSH
an jedem solchen Punkt, der zwei Marker einfügen würde. Dann können Sie nach dem Neun-Byte-Muster 00 00 ff ff 00 00 00 ff ff
suchen, um diese zu finden. Das ist nicht anders als die Suche nach dem Sechs-Byte-Marker in bzip2-Dateien, außer dass ein falsches positives mit neun Bytes viel weniger wahrscheinlich ist. Dann benötigen Sie keine separate Indexdatei.
Sowohl gzip und xz unterstützen einfache Verkettung. Auf diese Weise können Sie ein Archiv auf einfache Weise für die parallele Dekomprimierung vorbereiten. Kurz gesagt:
gzip <a> a.gz
gzip <b> b.gz
cat a.gz b.gz > c.gz
gunzip <c.gz> c
cat a b | cmp - c
wird der Vergleich erfolgreich sein.
Sie können dann einfach in Stücke der gewünschten Größe komprimieren und die Ergebnisse verketten. Speichern Sie einen Index für die Offsets des Anfangs jedes gzip-Streams. Dekomprimieren Sie von diesen Offsets. Je nach Ihrer Anwendung können Sie die Größe der Blöcke nach Ihren Wünschen auswählen. Wenn Sie sie jedoch zu klein machen, wird die Komprimierung beeinträchtigt.
Mit der einfachen Verkettung von gzip-Dateien können Sie auch auf den Index verzichten, wenn Sie für jeden Chunk eine feste unkomprimierte Größe festgelegt haben. Dann endet jeder Chunk mit den gleichen vier Bytes, die unkomprimierte Länge in der Little-Endian-Reihenfolge, z.B. 00 00 10 00
für 1 MiB Chunks, gefolgt von 1f 8b 08
vom nächsten Chunk, der der Beginn eines gzip-Headers ist. Dieser Sieben-Byte-Marker kann dann genauso wie der bzip2-Marker gesucht werden, allerdings wiederum mit einer geringeren Wahrscheinlichkeit von Falsch-Positiven.
Das gleiche könnte mit verketteten XZ-Dateien getan werden, deren Header die sieben Bytes ist: fd 37 7a 58 5a 00 00
.
Ich bevorzuge LZ4 selbst in diesen Tagen. –
überraschte Sie Zlib ausgelassen. – nikk