Re: Ищется библиотека для сжатия с возможностью Seek
От: BulatZiganshin  
Дата: 26.05.11 15:19
Оценка: 2 (1) +1
Здравствуйте, dimb82, Вы писали:

D>Теперь требуется, чтобы файл образа на лету упаковывался в архив какого-нибудь популярного формата (zip, tar, bz2, ...).

D>Существуют ли в природе такие библиотеки для сжатия, которые бы позволяли писать в архив данные по произвольному смещению?

нет конечно. им ведь потом сжатые данные надо в результирующий архив записать, верно? а куда их записывать, если они ещё предыдущие данные не видели и не знают насколько те сожмутся?

для этого потребуется специально разработанный формат архива, с индексом
Люди, я люблю вас! Будьте бдительны!!!
Re: Ищется библиотека для сжатия с возможностью Seek
От: gegMOPO4  
Дата: 28.05.11 13:41
Оценка: 2 (1)
Конкатенация нескольких gzip-нутых файлов воспринимается как один gzip-нутый файл.

Поскольку размер изменяемого заголовка известен, делаем приблизительно так:

Открываем выходной файл (fd=open()).
Открываем gzip без сжатия (gzdopen(dup(fd), "w0")), записываем заголовок, закрываем gzip (но не исходный fd).
Открываем gzip с сжатием (gzdopen(dup(fd), "w0")), записываем данные. Если в процессе нужно обновить заголовок, запоминаем позицию оригинального дескриптора fd, переходим на начало, повторяем запись изменённого заголовка (с открытием/закрытием gzip-а), возвращаемся назад. Но лучше отложить это до конца записи, а изменения сохранять в памяти.
Закрываем gzip, закрываем дескриптор fd.

Можно и по другому, а может из-за каких-то деталей это не пройдёт. В крайнем случае можно на диск записать отдельными файлами сжатые данные и заголовок (можно тоже сжатый), а потом слить их.
Ищется библиотека для сжатия с возможностью Seek
От: dimb82  
Дата: 26.05.11 05:07
Оценка:
Всем добрый день!

Разрабатываемый мной софт создаёт образы дисков и томов в формате VHD.
Теперь требуется, чтобы файл образа на лету упаковывался в архив какого-нибудь популярного формата (zip, tar, bz2, ...).
Особенность создания файлов образа такова, что данные не всегда записываются последовательно байт за байтом. Например, пишется последовательно несколько гигабайт, а потом обновляется заголовок и служебные структуры, которые находятся в начале файла.

Существуют ли в природе такие библиотеки для сжатия, которые бы позволяли писать в архив данные по произвольному смещению?
Re: Ищется библиотека для сжатия с возможностью Seek
От: мыщъх США http://nezumi-lab.org
Дата: 26.05.11 05:12
Оценка:
Здравствуйте, dimb82, Вы писали:

D>Всем добрый день!


D>Существуют ли в природе такие библиотеки для сжатия, которые бы позволяли писать в архив данные по произвольному смещению?

zlib, например. не совсем по произвольному, конечно, там идет окнами сжатие. как и во многих других библиотеках.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: Ищется библиотека для сжатия с возможностью Seek
От: dimb82  
Дата: 26.05.11 05:29
Оценка:
Здравствуйте, мыщъх, Вы писали:
М>zlib, например. не совсем по произвольному, конечно, там идет окнами сжатие. как и во многих других библиотеках.

Я в zlib нашёл только функцию gzseek. Но, судя по описанию функции, она не подходит под описанные требования:

z_off_t gzseek (gzFile file, z_off_t offset, int whence);
Устанавливает начальную позицию для последующего вызова gzread или gzwrite на заданном сжатом файле. Параметр offset представляет количество байт в несжатом потоке данных. Параметр whence такой же, что и в lseek(2); значение SEEK_END не поддерживается.
Если файл открыт для чтения, эта функция эмулируется, что может происходить чрезвычайно медленно. Если файл открыт для записи, то поддерживается только смещение вперед. Если при сжатии gzseek попадется последовательность нулей, то указатель будет смещен на новую стартовую позицию.
Функция gzseek возвращает текущее положение курсора, измеряемое в байтах от начала некомпресованного потока данных, или -1 в случае ошибки, в частности, если файл был открыт для записи и новую позицию курсора нужно расположить перед текущей позицией.


То есть поддерживается только смещение вперёд. Мне же очень важно, чтобы поддерживалось смещение назад.

Или я смотрю не на ту функцию?
Re: Ищется библиотека для сжатия с возможностью Seek
От: uzhas Ниоткуда  
Дата: 26.05.11 06:33
Оценка:
Здравствуйте, dimb82, Вы писали:

D>Особенность создания файлов образа такова, что данные не всегда записываются последовательно байт за байтом. Например, пишется последовательно несколько гигабайт, а потом обновляется заголовок и служебные структуры, которые находятся в начале файла.


предлагаю подумать в этом направлении.
например, формировать VHD во временное место сначала (или даже в пункт назначения), а потом сжимать любым алгоритмом
Re[2]: Ищется библиотека для сжатия с возможностью Seek
От: dimb82  
Дата: 26.05.11 17:14
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>для этого потребуется специально разработанный формат архива, с индексом


А есть существующие форматы с таким индексом?

Я бы мог встроить сжатие непосредственно в сам образ, но тогда бы получился совсем другой формат, нежели VHD, что нежелательно.
В формате VHD всё пространство виртуального диска делится на блоки фиксированного размера (обычно это 2МБ). В файл образа пишутся только использованные блоки (на которых есть полезные данные). Для хранения адресов блоков в файле образа используется внутренняя структура Block Allocation Table. Если бы я встраивал сжатие непосредственно в образ, то я бы сжимал каждый блок, при этом сохраняя размер сжатого блока. Если требуется обновить данные уже записанного блока, то я бы писал данные в конец файла образа (при невозможности обновить данные на старом месте), а потом просто менял адрес блока в Block Allocation Table. При этом, конечно, появлялось бы неиспользованное место в середине файла образа, но это допустимо для моей задачи.

Интересно, используется ли схожий подход в каком-либо из популярных форматов сжатия.
Re[2]: Ищется библиотека для сжатия с возможностью Seek
От: dimb82  
Дата: 26.05.11 17:16
Оценка:
U>предлагаю подумать в этом направлении.
U>например, формировать VHD во временное место сначала (или даже в пункт назначения), а потом сжимать любым алгоритмом

К сожалению, такой подход не подходит для данной задачи. Файл образа может занимать сотни гигабайт. Может просто не хватит свободного места для хранения и сжатой и несжатой версий файлов. К тому же это существенно увеличит время создания файла образа.
Re[3]: Ищется библиотека для сжатия с возможностью Seek
От: BulatZiganshin  
Дата: 26.05.11 17:17
Оценка:
Здравствуйте, dimb82, Вы писали:

D>А есть существующие форматы с таким индексом?


ntfs я таких форматов не знаю, поскольку для архивов это неактуально. так что придётся тебе делать это самому
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: Ищется библиотека для сжатия с возможностью Seek
От: lazy_walrus  
Дата: 26.05.11 18:07
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>Здравствуйте, dimb82, Вы писали:


D>>А есть существующие форматы с таким индексом?


BZ>ntfs я таких форматов не знаю, поскольку для архивов это неактуально. так что придётся тебе делать это самому


А какже старый добрый стэкер и его аналоги? Нам насколько я понимаю там использовались простые алгоритмы сжатия типа LZW, симметричные по скорости компрессии/декомпрессии.
Re[5]: Ищется библиотека для сжатия с возможностью Seek
От: BulatZiganshin  
Дата: 26.05.11 18:14
Оценка:
Здравствуйте, lazy_walrus, Вы писали:

_>А какже старый добрый стэкер


да, это из той же серии
Люди, я люблю вас! Будьте бдительны!!!
Re: Ищется библиотека для сжатия с возможностью Seek
От: Uzumaki Naruto Ниоткуда  
Дата: 27.05.11 15:05
Оценка:
Можно узнать — какая цель хранить и передавать не сжатое видео?
Если нужно — как насчет алгоритмов сжатия видео без потерь?

Re[2]: Ищется библиотека для сжатия с возможностью Seek
От: Uzumaki Naruto Ниоткуда  
Дата: 27.05.11 15:07
Оценка:
Например

Animation codec
CamStudio Video Codec
CorePNG
FFV1
Huffyuv
Lagarith
LCL
MSU Lossless Video Codec
Qbit Lossless Codec
SheerVideo
TSCC — TechSmith Screen Capture Codec
WMC — Wavelet Media Codec

Re[2]: Ищется библиотека для сжатия с возможностью Seek
От: dimb82  
Дата: 27.05.11 15:15
Оценка:
UN>Можно узнать — какая цель хранить и передавать не сжатое видео?
UN>Если нужно — как насчет алгоритмов сжатия видео без потерь?

Это вовсе не видео. Требуется хранить образ дисков в формате VHD. Этот формат используется виртуальными машинами Hyper-V и VirtualPC.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.