2009-09-30 11 views
9

Dire che ho un file bzip2 (oltre 5 GB) e voglio decomprimere solo il blocco #x, perché è dove sono i miei dati (il blocco è diverso ogni volta). Come lo farei?Solo decomprimere un blocco bzip2 specifico

Ho pensato di fare un indice di dove sono tutti i blocchi, quindi tagliare il blocco di cui ho bisogno dal file e applicare bzip2recover su di esso.

Ho anche pensato di comprimere 1 MB alla volta, quindi aggiungerlo a un file (e registrare la posizione) e semplicemente afferrare il file quando ne ho bisogno, ma preferisco mantenere intatto il file originale di bzip2.

La mia lingua preferita è Ruby, ma la soluzione di qualsiasi lingua va bene per me (purché comprenda il principio).

risposta

6

C'è un http://bitbucket.org/james_taylor/seek-bzip2

Afferra la fonte, compilarlo.

Run con

./seek-bzip2 32 < bzip_compressed.bz2 

per testare.

l'unico parametro è lo spostamento di bit dell'intestazione di blocco richiesta. È possibile ottenerlo trovando una stringa esadecimale "31 41 59 26 53 59" nel file binario. QUESTO È STATO SCORRETTO. inizio blocco può non essere allineato al limite di byte, così si dovrebbe cercare ogni possibile bit turni di "31 41 59 26 53 59" stringa esadecimale, come si è fatto in bzip2recover - http://www.bzip.org/1.0.3/html/recovering.html

32 è formato po 'di "BZh1 "header dove 1 può essere qualsiasi cifra da" 1 "a" 9 "(nel classico bzip2) - è una dimensione del blocco (non compresso) in centinaia di kb (non esatta).

+0

sic! l'inizio del blocco non può essere un limite di byte :(C'è un programma bzip-table incluso in "seek-bzip2" per ottenere l'elenco di spostamento dei bit e dimensioni delle dimensioni dei blocchi dati originali. – osgx

+0

sfortunatamente, "bzip-table" è quasi lo stesso velocità come decompressione effettiva :(. Fa un ciclo di decompressione quasi completo, ma non controlla CRC. – osgx

+0

Inoltre, dai un'occhiata a bzips paralleli, come pbzip2 di Jeff Gilchrist.Nella decompressione parallela è necessario cercare le intestazioni di blocco. http://www.google.com/codesearch/p?hl=it#calSvFpbfuI/trunk/trunk/demo/pbzip2-1.0.2/pbzip2.cpp&q=pbzip2&sa=N&cd=2&ct=rc&l=3 Funzione 'producer_decompress' – osgx

2

È vero che bzip-table è quasi lento quanto la decompressione, ma ovviamente devi farlo una volta sola e puoi memorizzare l'output in qualche modo da usare come indice. Questo è perfetto per quello di cui ho bisogno ma potrebbe non essere quello di cui tutti hanno bisogno.

Avevo bisogno di un piccolo aiuto per farlo compilare su Windows.

+0

prova mingw con msys – osgx

+0

http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20110316/mingw-get-inst-20110316.exe/download – osgx