Индексирование / произвольный доступ к архивам 7zip .7z - PullRequest
4 голосов
/ 16 декабря 2010

Существуют инструменты для обеспечения произвольного доступа к архивам gzip и bzip2:

Я ищу любое подобное решение для 7zip

(Цель состоит в том, чтобы использовать иногда гигантские файлы дампа Википедии в автономном режиме, не распаковывая их)

Ответы [ 2 ]

5 голосов
/ 04 мая 2014

Мой lzopfs проект обеспечивает произвольный доступ к файлам lzop, gzip, bzip2 и xz. XZ-файлы имеют кодировку LZMA, так что, надеюсь, они подойдут для 7-zip для ваших целей. Обратите внимание, что для реалистичного произвольного доступа вам нужно будет создать свой архив xz с заблокированным кодером, таким как pixz или многопоточным режимом xz-utils 5.1.x alpha.

5 голосов
/ 25 декабря 2011

Я подумал, что лучше обобщить внутренности GZIP, BZIP2 и LZMA, чтобы прояснить кое-что:

  1. GZIP - это формат, который использует алгоритм Deflate.Из-за статических кодов Хаффмана (в документах deflate также упоминается о динамическом Хаффмане, но на самом деле они тоже статические), deflate должен быть закодирован как блочный (скользящее окно - еще один термин здесь).zran.c, кажется, находит границы этих блоков и пытается декодировать максимум 2 последовательных блока, которые могут содержать несколько несжатых данных по КиБ для сбора достаточного количества данных для распаковки (для заполнения всего окна 32 КиБ).Таким образом, произвольный доступ вполне возможен даже без таблицы индексов.

  2. BZIP2 на самом деле является алгоритмом сжатия класса BWT.И из-за природы BWT, это не удивительно, что это блочно.Его блоки ограничены до 900 КиБ для каждого отдельного блока.Кроме того, границы блоков хорошо определены для легкого процесса восстановления (имеет огромные отличительные маркеры).Таким образом, вы можете даже использовать несколько потоков одновременно для распаковки всех данных.Другими словами, произвольный доступ вполне возможен даже без какой-либо таблицы (он уже поддерживается форматом).

  3. LZMA поддерживает словарь до 1 ГиБ и не кодируется по блокам.Он использует кодер диапазона для кодирования вероятностей, а не кодер Хаффмана.Даже учитывая размер окна 64 МБ (очень распространенное значение), из-за природы кодера диапазона мы не можем просто декодировать в заданной случайной точке, пока не заполним все окно.Кроме того, конечный автомат LZMA также может быть надоедливым.Таким образом, его реализация довольно сложна или даже невозможна.

Возможно, для таких случаев можно использовать методы LZMA2 или PPM (7-zip поддерживает их также в формате 7-zip).PPM сбрасывает свою модель, когда статистика полна, а LZMA2 преднамеренно сбрасывает некоторое состояние через некоторый интервал, чтобы включить многопоточную декомпрессию.Возможна их реализация с произвольным доступом.

...