Быстрый способ сжатия двоичных данных? - PullRequest
2 голосов
/ 02 ноября 2010

У меня есть некоторые двоичные данные (значения пикселей) в int [] (или байте [], если вы предпочитаете), которые я хочу записать на диск в приложении для Android. Я только хочу использовать небольшое количество времени обработки, но хочу для этого максимально сжатие. Какие у меня варианты?

Во многих случаях массив будет содержать много последовательных нулей, поэтому что-то простое и быстрое, например, сжатие RLE, вероятно, будет работать хорошо. Я не вижу никаких функций Android API для этого, хотя. Если мне придется перебирать массив в Java, это будет очень медленно, поскольку на большинстве устройств Android JIT отсутствует. Я мог бы использовать NDK, но я бы предпочел этого избежать, если смогу.

Ответы [ 5 ]

2 голосов
/ 02 ноября 2010

DeflatorOutputStream занимает ~ 25 мс для сжатия 1 МБ в Java.Это нативный метод, поэтому JIT не должен иметь большого значения.

Есть ли у вас требование, согласно которому 0,2 с или 0,5 с слишком медленные?

Можете ли вы сделать это в фоновом потоке, чтобы пользователь не заметил, сколько времени это займет?

GZIP основан на дефляторе + CRC32, поэтому, скорее всего, он будет примерно таким же или чуть медленнее.

Дефлятор имеет несколько режимов.DEFAULT_STRATEGY является самым быстрым в Java, но более простые сжатия, такие как HUFFMAN_ONLY, могут быть быстрее для вас.

2 голосов
/ 02 ноября 2010

Android имеет Java DeflaterOutputStream .Будет ли это работать?

1 голос
/ 01 марта 2011

Мне пришлось решить в основном ту же проблему на другой платформе, и я решил использовать модифицированное сжатие LZW.Во-первых, сделайте некоторую фильтрацию различий (аналогичную PNG) на изображении с 32bpp.Это превратит большую часть изображения в черное, если есть большие области общего цвета.Затем используйте универсальный алгоритм сжатия GIF, который обрабатывает отфильтрованное изображение так, как если бы оно было 8bpp.Вы получите приличное сжатие, и оно работает очень быстро.Это нужно будет запустить в нативном коде (NDK).Очень просто заставить работать нативный код на Android.

1 голос
/ 02 ноября 2010

Передача байтового массива в
http://download.oracle.com/javase/6/docs/api/java/io/FileWriter.html
и цепочка
http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/GZIPOutputStream.html к нему

тогда, когда вам нужно прочитать данные обратно в doобратная http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileReader.html
и цепочка
http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/GZIPInputStream.html

В зависимости от размера файла, который вы сохраняете, вы увидите, что какое-то сжатие Gzip хорошо, если вы не видите большую часть сделкипросто записать данные в несжатом виде с использованием буферизованного устройства записи (это должно быть самым быстрым).Также, если вы выполните gzip с использованием буферизированного устройства чтения, это также может немного ускорить его.

0 голосов
/ 02 ноября 2010

Случайная мысль: если это данные изображения, попробуйте сохранить его как png.У стандартного Java это есть, я уверен, что Android тоже будет, и, вероятно, оптимизирован с нативным кодом.У него довольно хорошее сжатие и без потерь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...