Accesso casuale flusso gzip
-
22-09-2019 - |
Domanda
Mi piacerebbe essere in grado di eseguire un accesso casuale in un file zippato. Posso permettermi di fare un po 'di pre-elaborazione su di esso (ad esempio, costruire una sorta di indice), a condizione che il risultato del pre-elaborazione è molto più piccolo del file stesso.
Qualche consiglio?
I miei pensieri erano:
- Hack su un'implementazione gzip esistente e serializzare il suo stato di decompressione ogni, diciamo, 1 megabyte di dati compressi. Poi, per eseguire un accesso casuale, deserializzare lo stato di decompressione e leggere dal confine megabyte. Questo sembra difficile, soprattutto perché sto lavorando con Java e non sono riuscito a trovare un'implementazione puro-java gzip: (
- Re-comprimere il file in blocchi di 1Mb e fare come sopra. Questo ha lo svantaggio di raddoppiare lo spazio su disco richiesto.
- Scrivi una semplice parser del formato gzip che non fa alcuna decompressione e solo rileva e indici bloccano i limiti (se ci sono anche eventuali blocchi: non ho ancora letto la descrizione del formato gzip)
Soluzione
Dai href="http://svn.ghostscript.com/ghostscript/tags/zlib-1.2.3/examples/zran.c" rel="noreferrer"> un'occhiata a questo link (C esempio di codice).
/* zran.c -- example of zlib/gzip stream indexing and random access
...
Gzip è solo zlib con una busta.
Altri suggerimenti
Il BGZF formato di file, compatibile con GZIP è stato sviluppato dai biologi.
(...) Il vantaggio di BGZF sopra gzip convenzionale è che BGZF permette per la ricerca, senza dover per eseguire la scansione attraverso l'intero file fino a la posizione ricercata.
http: / /picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ , dare un'occhiata a BlockCompressedOutputStream e BlockCompressedInputStream.java
domanda interessante. Non capisco il motivo per cui la vostra seconda opzione (file in blocchi ricomprimere) raddoppierebbe lo spazio su disco. Mi sembra che sarebbe stato lo stesso, meno una piccola quantità di overhead. Se si ha il controllo sopra il pezzo di compressione, che poi sembra l'idea giusta.
Forse quello che vuoi dire è che non si ha il controllo su l'ingresso, e quindi sarebbe il doppio.
Se si può fare, sto immaginando modellandolo come una classe CompressedFileStream che utilizza come archivio di backup, una serie di macchie 1mb compresso con gzip. Durante la lettura, un seek () sul flusso sarebbe poi passare a blob appropriata e decomprimere. A Read () dopo la fine di un blob causerebbe il flusso di aprire il prossimo blob.
ps: GZIP è descritta in IETF RFC 1952 , ma utilizza sgonfiare per il formato di compressione. Non ci sarebbe alcun motivo per utilizzare l'elaborazione GZIP se implementato questa classe CompressedFileStream come ho immaginato.
FWIW: Ho sviluppato uno strumento a riga di comando su zlib di < em> zran.c il codice sorgente che crea gli indici per i file gzip: https: // github.com/circulosmeos/gztool
Si può anche creare un indice per un file ancora in crescita gzip (ad esempio un registro creato da rsyslog direttamente in formato gzip) riducendo così in pratica a zero il tempo della creazione dell'indice. Vedere la -S
( Supervisionare ) l'opzione.