Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Март 07, 2013, 09:54



Название: Посчитать примерный размер архива
Отправлено: ecspertiza от Март 07, 2013, 09:54
Собственно все в заголовке, нужно перед архивацией прикинуть, хотя бы примерно, сколько будет весить архив. Кто знает есть ли алгоритм ?


Название: Re: Посчитать примерный размер архива
Отправлено: Bepec от Март 07, 2013, 10:11
Помоему никак. Там жеж всё зависит от содержимого файлов вроде. Файлы заполненные "АААА" сожмутся на 95 %.


Название: Re: Посчитать примерный размер архива
Отправлено: kuzulis от Март 07, 2013, 10:24
Ну, заархивировать куда-нить в файл в виртуальной/оперативной памяти (или, может быть tmpfs или как там),
посчитать сколько оно получилось по размеру.
Если много - то освободить, если нормуль - то скинуть содержимое в файл на ЖД.  :)


Название: Re: Посчитать примерный размер архива
Отправлено: Igors от Март 07, 2013, 10:34
Собственно все в заголовке, нужно перед архивацией прикинуть, хотя бы примерно, сколько будет весить архив. Кто знает есть ли алгоритм ?
Из каждого файла взять кусок (примерно 8K), сжать его в памяти и посмотреть что получилось. 


Название: Re: Посчитать примерный размер архива
Отправлено: navrocky от Март 07, 2013, 13:02
На 0.5 умножай размер. А если серьёзно, то можно по типам файлов определить их сжимаемость. Предположим, мы знаем, что exe жмутся в 2 раза, jpg, png, архивы, odt не жмутся, txt, html - жмутся хорошо раз в 5.
Вот пройдись по файлам и просчитай.


Название: Re: Посчитать примерный размер архива
Отправлено: Bepec от Март 07, 2013, 13:04
К тому же следует понимать, что некоторые типы данных наоборот разбухнут :) Помнится какой-то dat файл зиповал - вышло на 20 мб больше, чем сам файл :D


Название: Re: Посчитать примерный размер архива
Отправлено: ecspertiza от Март 07, 2013, 13:19
Я почему то надеялся на то ,что есть алгоритм который может это посчитать. Жать в оперативную память ,а потом проверять размер не очень хорошо, в этом случае мне проще изменить логику программы.

Пока больше всего подходит идея Igors. Если файл psd у меня жмется примерно на 71% то алгоритм показывает 78, да погрешность есть, но это можно учитывать.

Умножать на 0.5, тоже не вариант хотя бы по тому ,что некоторые файлы так не жмутся, а определять % сжатия для каждого формата ну это же можно и год за компом провести :)


Название: Re: Посчитать примерный размер архива
Отправлено: Igors от Март 07, 2013, 14:12
Простой но интересный тест: создать 1000 float с помощью rand() и записать в двоичный файл. Практически не жмется - потому что шум "белый". Впрочем и "розовый" тоже не очень


Название: Re: Посчитать примерный размер архива
Отправлено: schmidt от Март 08, 2013, 23:04
Цитировать
Собственно все в заголовке, нужно перед архивацией прикинуть, хотя бы примерно, сколько будет весить архив. Кто знает есть ли алгоритм ?

Собственно, такого алгоритма нет  ;) Вся "беда" в том что:

1. Разных алгоритмов сжатия существует бесчисленное множество, достаточно взглянуть хотя бы на подобные тесты: http://www.compression.ru/arctest/act/act-text.htm

2. Результат работы зависит непосредственно от самих данных. Посмотрите, для примера, алгоритм Хаффмана: http://habrahabr.ru/post/144200/. Вообще вот здесь http://www.compression.ru/arctest/descript/comp-hist.htm лежит очень занятный обзор техник сжатия данных.

Теоретически возможно приблизительно определить, пожат ли файл архиватором/протектором, рассчитав его энтропию - в частности такой трюк реализован в утилите PeID, предназначенной для определения конкретного протектора, которым был обработан EXE-файл. Однако, это лишь приблизительная оценка.