Ecco cinque modi con gzip, tre che richiedono un indice, due no.
È possibile creare un indice per qualsiasi file gzip, cioè non appositamente costruito, come fatto da zran.c. Quindi puoi iniziare la decompressione ai limiti dei blocchi. L'indice include 32 KB di cronologia dati non compressi in ogni punto di ingresso.
Se si sta costruendo il file gzip, allora può essere creato con punti di ingresso periodici il cui indice non ha bisogno della cronologia non compressa in quei punti di ingresso, creando un indice più piccolo. Questo viene fatto con l'opzione Z_FULL_FLUSH
su deflate()
in zlib.
Si potrebbe anche fare un Z_SYNC_FLUSH
seguito da un Z_FULL_FLUSH
in corrispondenza di ciascun punto, che inserirà due indicatori. Quindi è possibile cercare il modello a nove byte 00 00 ff ff 00 00 00 ff ff
per trovarli. Non è diverso dal cercare l'indicatore di sei byte nei file bzip2, tranne che un falso positivo è molto meno probabile con nove byte. Quindi non è necessario un file di indice separato.
Entrambi gzip e xz supportano la concatenazione semplice. Ciò consente di preparare facilmente un archivio per la decompressione parallela in un altro modo. In breve:
gzip <a> a.gz
gzip <b> b.gz
cat a.gz b.gz > c.gz
gunzip <c.gz> c
cat a b | cmp - c
comporterà il confronto successivo.
È quindi possibile comprimere semplicemente in blocchi della dimensione desiderata e concatenare i risultati. Salva un indice agli scostamenti all'inizio di ogni flusso gzip. Decomprimere da queste compensazioni. Puoi scegliere la dimensione dei blocchi a tuo piacimento, a seconda dell'applicazione. Se li rendi troppo piccoli, tuttavia, la compressione verrà influenzata.
Con una semplice concatenazione di file gzip, è possibile anche rinunciare all'indice se si rende ogni pezzo un formato non compresso fisso. Quindi ciascun blocco termina con gli stessi quattro byte, la lunghezza non compressa nell'ordine little-endian, ad es. 00 00 10 00
per 1 blocco MiB, seguito da 1f 8b 08
dal chunk successivo, che è l'inizio di un'intestazione gzip. Quel marcatore a sette byte può quindi essere cercato esattamente come il marcatore bzip2, sebbene di nuovo con una minore probabilità di falsi positivi.
Lo stesso potrebbe essere fatto con i file xz concatenati, la cui intestazione è i sette byte: fd 37 7a 58 5a 00 00
.
Preferisco LZ4 me stesso in questi giorni. –
sorpreso che hai lasciato fuori Zlib. – nikk