2010-12-16 2 views
4

Инструменты существуют, чтобы обеспечить произвольный доступ к GZIP и bzip2 архивы:Индексация/случайный доступ к 7zip .7z архивов

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

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

+1

Немного педантичный, я признаю, но является ли реальной целью избежать повторного сжатия архивов, а не избегать их сжатия? (Я ожидаю, что для генерации индекса потребуется декомпрессия архива, хотя и в памяти, а не на диске.) Если вы не возражаете против одноразовой фазы повторного сжатия, вы можете повторно сжать в 7z с помощью Параметр SOLID отключен (или установлен на небольшое значение), который дает вам архивы, вы можете делать произвольный доступ без массивных ожиданий. (IMO, эта стандартная опция по умолчанию используется в большем количестве мест, чем должна быть. :() – 2010-12-17 08:34:56

+0

Я не против распаковывать их как единовременную стоимость для создания индекса.Но я не хочу их повторно сжимать, потому что я хочу, чтобы ограниченные машины, такие как нетбуки, могли использовать неизменные архивные файлы по мере их публикации. Повторное сжатие происходит намного медленнее и ресурсоемкой, а в повторно сжатых архивах больше нет контрольных сумм MD5, соответствующих опубликованным. Получение издателем для создания архивов в другом формате может привести к некоторым переговорам, но я забронирую это как последнее средство, и в этом случае объединение более мелких архивов 7zip, вероятно, также будет работать нормально. – hippietrail 2010-12-17 11:26:20

ответ

5

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

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

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

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

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

4

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