Только распаковывать специфический блок BZIP2
-
19-09-2019 - |
Вопрос
Скажем, у меня есть файл BZIP2 (более 5 ГБ), и я хочу декомпрессировать только блок #x, потому что есть там, где есть мои данные (блок разные каждый раз). Как бы я это сделал?
Я подумал о том, чтобы сделать индекс того, где находятся все блоки, а затем вырезал блок, который мне нужен из файла, и применить к нему Bzip2recover.
Я также думал о сжатии, скажем, 1 МБ за раз, а затем добавление этого к файлу (и записи местоположения), и просто захватить файл, когда он мне нужен, но я бы предпочел сохранить исходный файл BZIP2 нетронутым.
Мой предпочтительный язык - рубин, но у любого языкового решения - это хорошо (до тех пор, пока я понимаю принцип).
Решение
Eсть 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) - это (несжатый) размер блока в сотнях KB (не точнее).
Другие советы
Это правда, что Bzip-Table почти такой же медленный, как декомпрессирующий, но, конечно, вам нужно сделать это только один раз, и вы можете сохранить результаты каким-то образом для использования в качестве индекса. Это идеально подходит для того, что мне нужно, но не может быть тем, что нужно всем.
Мне действительно нужно было немного помочь получить его для компиляции в Windows.