Непоследовательный доступ к сжатым данным

Тема в разделе "WASM.WIN32", создана пользователем provocateur, 12 сен 2008.

  1. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    У меня есть такая задача:
    1. большой текстовый файл, допустим, с энциклопедией
    2. прогнать весь файл и получить словарь для сжатия
    3. сохранить полученный словарь для сжатия
    4. с помощью полученного словаря сжать отдельно каждую статью энциклопедии, поместить это все в один большой файл, сохранив смещения начала статей
    5. доставать по смещению сжатую статью и распаковывать ее имеющимся словарем.

    Все это делается для ускорения распаковки и экономии памяти, распаковать статью размером в тысячу байт проще, чем весь файл размером в сотню мегабайт.

    Возможно ли такое? и в направлении каких функций копать
    Либо есть возможность начинать распаковку с любого места файла и получать корректные данные?

    Вроде бы что-то подобное есть в zlib, сталкивался ли кто-то с такой задачей и как решил?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Если это LZ-сжатие, то словарь составляется параллельно упаковыванию файла, невозможно "прогнать весь файл и получить словарь для сжатия". Если уж на то пошло, то почему бы не упаковать каждый файл и не объединить их в новый один с иерархической структурой?
    все упаковывается в один архив rar и используется UnRar.exe
     
  3. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    KeSqueer, как раз получить общий словарь возможно, а на основе словаря проводить сжатие кусков. при этом, естественно, словарь должен быть основан на этих же текстах, иначе эффективность сжатия будет очень низкая.
    unrar. не подходит, хотя бы потому что накладные расходы для хранения тысяч очень маленьких будут очень велики, а степень сжатия очень низкая, если жать каждый файл отдельно. если использовать solid, то ситуация та же самая как с отдельным файлом: чтобы получить доступ к элементу нужно будет распаковать все предыдущие файлы, а это очень долго.
     
  4. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    только там не сказано как упаковывать данные, имея этот словарь
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Дык тебе и предлложили соединить их в один файл - затем берёшь нужный кусок - вытаскиваешь сжатым и распаковываешь чем хочешь можно с промежуточным сохранением архива на диск, а можно и сразу в памяти.
     
  6. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    Y_Mur, предложили в один файл напихать кучу маленьких. Ну к примеру 50 тысяч. Погляди структуру rar архива сколько байт уходит просто на хранение одного файла, при том что размер этого файла редко будет превышать тысячу байт. Плюс для каждого файла кроме сжатой информации во внутренней структуре архива хранится еще и словарь, с помощью которого этот файл сжат. В результате, скорей всего объем не уменьшиться, а увеличится, потому что эффективность сжатия напрямую зависит от объема сжимаемой информации.
     
  7. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Посмотри исходники 7z там и сжатие текстов лучше раровского и опенсорц можно перезаточить под то что хочется
     
  9. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    provocateur
    Посмотри в сторону lz78. Для такой задачи он должен очень хорошо подойти. Наверняка есть реализации.
     
  10. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    http://compression.ru/download/text.html

    Погляди PPMd Дмитрия Шкарина. Реализация и описание есть здесь.
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    provocateur
    Может я что-то не понимаю, но я всегда полагал, что словарь динамически образуется во время упаковки/распаковки и нигде не хранится. Если про LZ речь конечно.
     
  12. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    asd, спасибо, реализаций куча, накачал. буду смотреть
    G13, ppmd вещь действительно классная, но для моих целей слишком медленная, хотя необходимо потестить в реальных условиях.
     
  13. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    KeSqueer, вроде как от реализации LZx зависит, а их очень и очень много. Проблема в том, что действительно последующие данные кодируются на основе предыдущих, это вроде как в LZ77, а в LZW есть конечный словарь, по умолчанию всего из 4096 элементов, хз как он хранится, знал бы, то не спрашивал :)