2009-09-30 12 views
9

Powiedz, że mam plik bzip2 (ponad 5 GB) i chcę rozpakować tylko blok #x, ponieważ tam są moje dane (blok jest inny za każdym razem). Jak to zrobić?Dekompresuj tylko określony blok bzip2.

Zastanowiłem się nad utworzeniem indeksu miejsc, w których znajdują się wszystkie bloki, a następnie wyciąć potrzebny blok z pliku i zastosować do niego bzip2recover.

Też myślałem o kompresji powiedzmy 1MB na raz, a następnie dołączając to do pliku (i nagrywając lokalizację) i po prostu chwytając plik, kiedy go potrzebuję, ale wolałbym zachować nienaruszony oryginalny plik bzip2.

Moim preferowanym językiem jest Ruby, ale rozwiązanie dowolnego języka jest w porządku (o ile rozumiem zasadę).

Odpowiedz

6

Jest http://bitbucket.org/james_taylor/seek-bzip2

Grab źródła, skompilować.

Run z

./seek-bzip2 32 < bzip_compressed.bz2 

przetestować.

Jedynym parametrem jest bitowa przemieszczenie nagłówka zastanawianego bloku. Możesz go uzyskać, znajdując w pliku binarnym ciąg szesnastkowy "31 41 59 26 53 59". TO NIEPRAWIDŁOWO. Początek bloku może nie być wyrównany do granicy bajtu, więc powinieneś wyszukać wszystkie możliwe przesunięcia bitowe ciągu "31 41 59 26 53 59", jak to jest w bzip2recover - http://www.bzip.org/1.0.3/html/recovering.html

32 jest bitowym rozmiarem "BZh1 "nagłówek, gdzie 1 może być dowolną cyfrą od" 1 "do" 9 "(w klasycznym bzip2) - jest to (nieskompresowany) rozmiar bloku w setkach kb (nie dokładny).

+0

sic! Początek bloku nie może być granicą bajtów :(W "seek-bzip2" znajduje się program Bzip-Table, aby uzyskać listę przesunięcia bitów i rozmiarów oryginalnych rozmiarów bloków danych: – osgx

+0

Niestety, "bzip-table" jest prawie taki sam prędkość jako faktyczna dekompresja :(To prawie pełny cykl dekompresji, ale nie sprawdzaj CRC – osgx

+0

Zobacz także równoległe bzipy, takie jak pbzip2 autorstwa Jeffa Gilchrista, a przy równoległej dekompresji musisz przeszukać nagłówki bloków. http://www.google.com/codesearch/p?hl=en#calSvFpbfuI/trunk/trunk/demo/pbzip2-1.0.2/pbzip2.cpp&q=pbzip2&sa=N&cd=2&ct=rc&l=3 Funkcja "producer_decompress" – osgx

2

To prawda, że ​​tabela bzip jest prawie tak samo wolna jak dekompresja, ale oczywiście trzeba to zrobić tylko jeden raz i można zapisać wynik w pewien sposób do wykorzystania jako indeks. Jest to idealne rozwiązanie dla tego, czego potrzebuję, ale może nie być tym, czego każdy potrzebuje.

Potrzebowałem niewielkiej pomocy przy kompilacji w systemie Windows.

+0

spróbuj mingw z 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

Powiązane problemy