Обратный алгоритм сжатия "JPEG"? - PullRequest
1 голос
/ 14 января 2012

Мне нужно написать инструмент, который управляет очень большими наборами данных (ну, большими для обычных рабочих станций). Мне нужно в основном то, что работает противоположно формату JPEG. Мне нужно, чтобы набор данных был неповрежденным на диске, где он может быть произвольно большим, но тогда он должен быть сжат с потерями, когда он будет прочитан в памяти, и только часть, используемая в любой момент времени, должна быть распакована во время полета. Я начал изучать ipp (Intel Integrated Performance Primitives), но пока не совсем понятно, могу ли я использовать их для своих задач. Кто-нибудь может указать мне правильное направление?

Спасибо.

1 Ответ

0 голосов
/ 14 января 2012

Учитывая характер ваших данных, кажется, что вы работаете с неким необработанным образцом. Таким образом, самый простой и общий метод «с потерями» - сбросить младшие биты, снизив точность, до желаемого уровня.

Обратите внимание, что вам нужно будет "отбросить младшие биты", что сильно отличается от "округления до следующей степени 10". Компьютер работает на базе 2, и вы хотите, чтобы все ваши младшие биты были "00000", чтобы сжатие работало как можно лучше. Этот метод предполагает, что выбранный алгоритм сжатия будет использовать предсказуемый 0-битовый шаблон.

Другим методом, более сложным и более конкретным, может быть преобразование ваших значений в виде индекса в таблицу. Преимущество состоит в том, что вы можете «нацеливать» точность там, где вы хотите. Очевидным недостатком является то, что таблица будет характерна для шаблона распределения.

Кроме того, вы можете также хранить не само значение, а дельту значения с предыдущим, если между ними есть какая-либо связь. Это тоже поможет сжатию.

Чтобы данные были сжаты, вам необходимо «сгруппировать» их по пакетам соответствующего размера, например, 64 КБ. На одном поле никакой алгоритм сжатия не даст вам подходящих результатов. Это, в свою очередь, означает, что каждый раз, когда вы хотите получить доступ к полю, вам необходимо распаковать весь пакет, поэтому лучше настраивайте его в зависимости от того, что вы хотите с ним делать. С последовательным доступом легче справиться в таких обстоятельствах.

Что касается алгоритма сжатия, поскольку эти данные будут «живыми», вам нужно что-то очень быстрое, чтобы доступ к данным имел очень малое влияние на задержку.

Существует несколько альтернатив с открытым исходным кодом для этого использования. Для более легкого управления лицензиями я бы порекомендовал альтернативу BSD. Поскольку вы используете C ++, следующие выглядят подходящими: http://code.google.com/p/snappy/ а также http://code.google.com/p/lz4/

...