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)
È stato utile?

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top