![]() |
![]() |
![]() |
|
новый СжатиеДанных(9) можно ли узнать на скока сжимает? | ☑ | ||
---|---|---|---|---|
0
ПульсЪ
27.10.10
✎
18:25
|
всем привет ) есть кусок кода:
ХранилищО = Новый ХранилищеЗначения(ВыбФайл,новый СжатиеДанных(9)); есть ВыбФайл, можно ли как нибудь узнать размер файла, после того как он сжат.. до сжатия размер легко выцепить, а после..? кто нибудь вкурсе, мб подскажите) |
|||
1
le_
27.10.10
✎
18:40
|
Примерно так же, как zip, наверное, жмет.
Deflate, как пишут, в gzip, pkzip используется. Точно вряд ли получится вычислить. |
|||
2
le_
27.10.10
✎
18:48
|
+ (1) Если сомневаешься, в эффективности, можешь сначала 7-zip-ом, например, паковать, а потом в хранилище подсовывать.
|
|||
3
ПульсЪ
28.10.10
✎
11:24
|
(2) сомневаюсь.. хотя хз.. нуна попробывать cf грузануть и попробывать думаю ккой нить большой вордовский документ и сравнить... сначала паковать потом грузить не оч подходит, т.к. хочу довести все до полного автомата..
|
|||
4
ПульсЪ
28.10.10
✎
12:12
|
ап
|
|||
5
ПульсЪ
28.10.10
✎
12:52
|
не ап, больше никаких вариков небудет?)
|
|||
6
Murzz
28.10.10
✎
13:02
|
(3) cf не имеет к этому никакого отношения
|
|||
7
forforumandspam
28.10.10
✎
13:08
|
До = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла), Новый СжатиеДанных(0));
После = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла), Новый СжатиеДанных(9)); Дальше допили формулу из Книга знаний: Как рассчитать размер данных помещенных в объект ХранилищеЗначения |
|||
8
forforumandspam
28.10.10
✎
13:12
|
+(7) не рекомендую таким способом большие объёмы проверять. ;-)
|
|||
9
H A D G E H O G s
28.10.10
✎
13:14
|
Зачем?
|
|||
10
nop
28.10.10
✎
13:16
|
ЗначениеВФайл() и проверить размер? (не путать размер на диске с размером файла)
|
|||
11
forforumandspam
28.10.10
✎
13:33
|
(10) Не прокатит.
Глобальный контекст ЗначениеВФайл (ValueToFile) Описание: Сохраняет любое сериализуемое значение в файл. |
|||
12
ПульсЪ
28.10.10
✎
13:37
|
(8) нащет больших объемов (>гб) я проблему решил)
а это ща попробую |
|||
13
forforumandspam
28.10.10
✎
13:40
|
(12) Начни с малых объёмов.
|
|||
14
aleks-id
28.10.10
✎
13:45
|
РезультатПак = ЗначениеВСтрокуВнутр(Новый ХранилищеЗначения(Новый ДвоичныеДанные("D:\win.txt"), Новый СжатиеДанных(9)));
НачальнаяПозиция = Найти(РезультатПак, "base64:")+7; ДлинаРП = СтрДлина(РезультатПак); Стр64 = Сред(РезультатПак, НачальнаяПозиция, ДлинаРП-НачальнаяПозиция-2); ДлинаФайла = Окр((СтрДлина(Стр64)-2*(СтрЧислоСтрок(Стр64)-1))/4*3); ДлинаФайла = ДлинаФайла - ?(Прав(Стр64,1) = "=",1,0) - ?(Прав(Стр64,2) = "==",1,0); Сообщить("Со сжатием: " + ДлинаФайла); |
|||
15
Rabbit
28.10.10
✎
13:49
|
что-то меня эта девятка на мысли о bzip наталкивает.
|
|||
16
aleks-id
28.10.10
✎
13:56
|
Base64Значение(Стр64).Записать("D:\win.bin");
проверьте сами что за формат :) |
|||
17
forforumandspam
28.10.10
✎
14:13
|
(14) Неправильно.
|
|||
18
ПульсЪ
28.10.10
✎
14:13
|
(14) спасибо ман, вроде работает)
|
|||
19
forforumandspam
28.10.10
✎
14:15
|
(18) Не слушай его. Он во первых забыл:
Хран = Новый ХранилищеЗначения(Новый ДвоичныеДанные("D:\win.txt"), Новый СжатиеДанных(9)); РезультатПак = ЗначениеВСтрокуВнутр(Хран.Получить()); |
|||
20
ПульсЪ
28.10.10
✎
14:18
|
(19) да не, вродерабит, проверил сжал кодом сначала, потом 7z этот же файл, погрешность разница около 2000 байт, думаю это из за того что разбивка по разным алгоритмам..
|
|||
21
forforumandspam
28.10.10
✎
14:22
|
(20) Ты попробуй коэффициент сжатия "0" поставить и получить первоначальный размер файла. Если будешь использовать код из (14), то не получишь равенства.
|
|||
22
ПульсЪ
28.10.10
✎
14:22
|
(21) ща
|
|||
23
ПульсЪ
28.10.10
✎
14:24
|
разница
файл объем кодом 4 506 389 сам файл 4 505 600 впринципе почти норм, видимо просто алгоритм формулы неточность выдает |
|||
24
forforumandspam
28.10.10
✎
14:27
|
(23) Нет, смотри код (19). Не забудь "Хран.Получить()"
|
|||
25
ПульсЪ
28.10.10
✎
14:31
|
(24) ща поправлю, попробуем)
|
|||
26
forforumandspam
28.10.10
✎
14:32
|
А ещё лишние 2 оператора. Вот эти строчки нафиг не нужны:
ДлинаРП = СтрДлина(РезультатПак); Стр64 = Сред(РезультатПак, НачальнаяПозиция, ДлинаРП-НачальнаяПозиция-2); если заменить РезультатПак = ЗначениеВСтрокуВнутр( на РезультатПак = Base64Строка( |
|||
27
ПульсЪ
28.10.10
✎
14:58
|
видимо да, ща попробую, т.к. код перестал вооще рабить и стал показывать один и тот же размер))
|
|||
28
forforumandspam
28.10.10
✎
15:03
|
(27) Сам проверил, Хран.Получить(), получается аналог "разархивировать". Значит его всё-таки надо убрать. И получается, что при коэффициенте "0" размер не совпадает из-за особенности типа "ХранилищеЗначения". Но (26) всё-же прими к сведению.
|
|||
29
ПульсЪ
28.10.10
✎
15:05
|
(28) да да, вот я о том же и говорил, что алгоритмы сжатия видим различаются, 7z чуть получше )
|
|||
30
ПульсЪ
28.10.10
✎
15:06
|
(29) хотя мб и от Хранилища... хз, но меня лично результат вполне устраивает
|
|||
31
aleks-id
28.10.10
✎
16:26
|
с точностью до байта:
//Создаем хранилище и сохранаем в него данные Хран = Новый ХранилищеЗначения(Новый ДвоичныеДанные("D:\win.txt"), Новый СжатиеДанных(9)); //Получаем строку, содержащую служебный заголовок и двоичные данные в формате base64 РезультатПак = ЗначениеВСтрокуВнутр(Хран); //Отсекаем заголовок и выцепаем строку base64 в чистом виде Стр64 = Сред(РезультатПак, Найти(РезультатПак, "base64:")+7, СтрДлина(РезультатПак)-Найти(РезультатПак, "base64:")-9); //Стр64 = Сред(РезультатПак, НачальнаяПозиция, ДлинаРП-НачальнаяПозиция-2); //Записываем сжатые двоичные данные в файл Base64Значение(Стр64).Записать("D:\win.bin"); Файл = Новый Файл("D:\win.bin"); //Получаем размер файла Сообщить(Файл.Размер()); |
|||
32
ПульсЪ
09.11.10
✎
18:27
|
(31) работает) спасибо)
для сравнения выяснил что 1C архиватор хуже чем 7z архиватор, ворд, эксель, текстовые сжимает не очень, зато трек .mp3 сжал чуток получше чем .7z интересный момент) |
|||
33
H A D G E H O G s
09.11.10
✎
21:51
|
(31)
С точностью до байта без записи в файл: Хран = Новый ХранилищеЗначения(Новый ДвоичныеДанные("D:\win.txt"), Новый СжатиеДанных(9)); //Получаем строку, содержащую служебный заголовок и двоичные данные в формате base64 РезультатПак = ЗначениеВСтрокуВнутр(Хран); //Отсекаем заголовок и выцепаем строку base64 в чистом виде Стр64 = Сред(РезультатПак, Найти(РезультатПак, "base64:")+7, СтрДлина(РезультатПак)-Найти(РезультатПак, "base64:")-9); Сообщить(СтрДлина(Стр64)*0.75); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |