У меня есть такая задача: 1. большой текстовый файл, допустим, с энциклопедией 2. прогнать весь файл и получить словарь для сжатия 3. сохранить полученный словарь для сжатия 4. с помощью полученного словаря сжать отдельно каждую статью энциклопедии, поместить это все в один большой файл, сохранив смещения начала статей 5. доставать по смещению сжатую статью и распаковывать ее имеющимся словарем. Все это делается для ускорения распаковки и экономии памяти, распаковать статью размером в тысячу байт проще, чем весь файл размером в сотню мегабайт. Возможно ли такое? и в направлении каких функций копать Либо есть возможность начинать распаковку с любого места файла и получать корректные данные? Вроде бы что-то подобное есть в zlib, сталкивался ли кто-то с такой задачей и как решил?
Если это LZ-сжатие, то словарь составляется параллельно упаковыванию файла, невозможно "прогнать весь файл и получить словарь для сжатия". Если уж на то пошло, то почему бы не упаковать каждый файл и не объединить их в новый один с иерархической структурой? все упаковывается в один архив rar и используется UnRar.exe
KeSqueer, как раз получить общий словарь возможно, а на основе словаря проводить сжатие кусков. при этом, естественно, словарь должен быть основан на этих же текстах, иначе эффективность сжатия будет очень низкая. unrar. не подходит, хотя бы потому что накладные расходы для хранения тысяч очень маленьких будут очень велики, а степень сжатия очень низкая, если жать каждый файл отдельно. если использовать solid, то ситуация та же самая как с отдельным файлом: чтобы получить доступ к элементу нужно будет распаковать все предыдущие файлы, а это очень долго.
Дык тебе и предлложили соединить их в один файл - затем берёшь нужный кусок - вытаскиваешь сжатым и распаковываешь чем хочешь можно с промежуточным сохранением архива на диск, а можно и сразу в памяти.
Y_Mur, предложили в один файл напихать кучу маленьких. Ну к примеру 50 тысяч. Погляди структуру rar архива сколько байт уходит просто на хранение одного файла, при том что размер этого файла редко будет превышать тысячу байт. Плюс для каждого файла кроме сжатой информации во внутренней структуре архива хранится еще и словарь, с помощью которого этот файл сжат. В результате, скорей всего объем не уменьшиться, а увеличится, потому что эффективность сжатия напрямую зависит от объема сжимаемой информации.
Посмотри исходники 7z там и сжатие текстов лучше раровского и опенсорц можно перезаточить под то что хочется
provocateur Посмотри в сторону lz78. Для такой задачи он должен очень хорошо подойти. Наверняка есть реализации.
http://compression.ru/download/text.html Погляди PPMd Дмитрия Шкарина. Реализация и описание есть здесь.
provocateur Может я что-то не понимаю, но я всегда полагал, что словарь динамически образуется во время упаковки/распаковки и нигде не хранится. Если про LZ речь конечно.
asd, спасибо, реализаций куча, накачал. буду смотреть G13, ppmd вещь действительно классная, но для моих целей слишком медленная, хотя необходимо потестить в реальных условиях.
KeSqueer, вроде как от реализации LZx зависит, а их очень и очень много. Проблема в том, что действительно последующие данные кодируются на основе предыдущих, это вроде как в LZ77, а в LZW есть конечный словарь, по умолчанию всего из 4096 элементов, хз как он хранится, знал бы, то не спрашивал