Распаковать только определенный блок bzip2

Скажем, у меня есть файл bzip2 (более 5 ГБ), и я хочу распаковать только блок #x, потому что там, где находятся мои данные (блок каждый раз меняется). Как бы я это сделал?

Я подумал о том, чтобы составить индекс, где находятся все блоки, затем вырезать нужный мне блок из файла и применить к нему bzip2recover.

Я также думал о сжатии, скажем, 1 МБ за раз, затем добавлял это к файлу (и записывал местоположение) и просто захватывал файл, когда мне это нужно, но я бы предпочел сохранить исходный файл bzip2 без изменений.

Я предпочитаю язык Ruby, но решение любого языка мне подходит (если я понимаю принцип).

2 ответа

Решение

Существует http://bitbucket.org/james_taylor/seek-bzip2

Возьмите источник, скомпилируйте его.

Бежать с

./seek-bzip2  32 < bzip_compressed.bz2 

тестировать.

единственный параметр - битовое смещение интересующего заголовка блока. Вы можете получить его, найдя шестнадцатеричную строку "31 41 59 26 53 59 " в двоичном файле. ЭТО БЫЛО НЕПРАВИЛЬНО. Начало блока может быть не выровнено по границе байта, поэтому вы должны искать все возможные битовые сдвиги шестнадцатеричной строки "31 41 59 26 53 59 ", как это делается в bzip2recover - http://www.bzip.org/1.0.3/html/recovering.html

32 - размер бита заголовка "BZh1", где 1 может быть любой цифрой от "1" до "9" (в классическом bzip2) - это (несжатый) размер блока в сотнях килобайт (не точно).

Это правда, что bzip-таблица почти такая же медленная, как декомпрессия, но, конечно, вам нужно сделать это только один раз, и вы можете каким-то образом сохранить выходные данные для использования в качестве индекса. Это идеально подходит для того, что мне нужно, но, возможно, не то, что нужно всем.

Мне нужна была небольшая помощь, чтобы он компилировался в Windows.

Другие вопросы по тегам