Массив сжатия байтов

Моя проблема: я хочу сохранить массив байтов в сжатом файле, а затем я хочу прочитать его с хорошей производительностью.

Итак, я создаю массив байтов, затем передаю алгоритму ZLIB и сохраняю его в файле. К моему удивлению, алгоритм не работает, вероятно, потому, что массив представляет собой случайную выборку. При таком подходе его будет легко читать. Просто скопируйте поток в память, распакуйте его и скопируйте в массив байтов.

Но мне нужно сжать файл. Должен ли я использовать алгоритм, например RLE, для сжатия массива байтов? Я думаю, что могу сохранить массив байтов как строку, а затем сжать его. Но я думаю, что у меня будет плохая производительность при чтении данных.

Извините за мой плохой английский.

Спасибо


person p.magalhaes    schedule 05.06.2010    source источник
comment
Мой файл похож на двоичный файл. Думаю, из-за этого у меня было очень плохое сжатие. Я прав?   -  person p.magalhaes    schedule 05.06.2010
comment
Вместо создания файла массива байтов я создаю файл массива целых чисел. И они это сжимают. К моему удивлению, файл массива целых чисел был очень хорошо сжат! Кто-нибудь знает почему? Благодарность   -  person p.magalhaes    schedule 05.06.2010
comment
Итак, я исследую еще немного. Файл, который я создавал с помощью функции random (255). Поэтому, когда я сжал его, размер увеличился.   -  person p.magalhaes    schedule 06.06.2010


Ответы (3)


Неясно, имеете ли вы в виду «случайную выборку» в статистическом смысле (выборка реальных данных, выбранных случайным образом) или просто случайно сгенерированные данные. Первый должен хорошо сжиматься.

Однако действительно случайные данные не могут быть сжаты (хорошо). Фактически, сжимаемость - это один из показателей случайности.

person Matthew Flaschen    schedule 05.06.2010
comment
Сделал тест. Я создаю файл, в котором хранится массив байтов со случайными байтами. Затем я попытался сжать его, но у меня ничего не вышло. Компрессия была очень плохой. Это как бинарный файл, поэтому сжатие плохое? - person p.magalhaes; 05.06.2010
comment
@Pedro, все алгоритмы сжатия работают, используя неслучайность входных данных. Таким образом, случайные данные плохо сжимаются. - person Matthew Flaschen; 05.06.2010
comment
Итак, мне нужен алгоритм, который сжимает мой массив байтов. Мне это кажется простым. Я хочу передать свой массив байтов алгоритму, а затем получить новый сжатый массив или поток. - person p.magalhaes; 05.06.2010

Если данные случайные, они будут иметь высокую энтропию. Не существует алгоритма, который мог бы успешно сжать такие данные. То есть, поскольку он случайный, вам может повезти в конкретном случае, но в целом бесполезно пытаться его сжать.

person Thorarin    schedule 05.06.2010

Вы уверены, что вам действительно нужно сжимать случайные данные? Наилучшее сжатие может быть достигнуто, если вы знаете источник данных и некоторые другие характеристики, которые можно использовать для выбора и оптимизации алгоритмов сжатия. Во-первых, насколько велики ваши массивы? Если это значения символов, есть разница в частоте каждой буквы. Если этот массив отсортирован или имеет уникальные значения, это также можно использовать для оптимизации пространства. Итак, каков источник ваших данных?

person watbywbarif    schedule 26.02.2014