Обратный алгоритм сжатия jpeg?

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

Спасибо.


person user1148583    schedule 13.01.2012    source источник
comment
Вы в основном ищете реализацию кодека JPEG? На каком языке вы работаете?   -  person Oliver Charlesworth    schedule 14.01.2012
comment
Какие данные задействованы? Сжатие изображений сильно отличается от сжатия текста, форекс.   -  person ergosys    schedule 14.01.2012
comment
Похоже, на сайте статистики SE будет лучше. выборка данных, преобразование, сводка, анализ и т. д. — все это относится к области статистики. Если данные имеют особый характер, например, изображения, аудио, текст и т. д., тогда могут применяться более специализированные методы.   -  person Iterator    schedule 14.01.2012
comment
Что именно означает потеря в данном контексте. Как вы думаете, какие данные могут быть потеряны?   -  person svick    schedule 14.01.2012
comment
Сжатие/распаковка должны быть максимально быстрыми, поэтому я буду использовать C++. Данные будут большие матрицы › 5GB и массивы.   -  person user1148583    schedule 14.01.2012
comment
Я провел немного больше исследований, и кажется, что анализ основных компонентов — это способ сжатия данных с потерями. Если я сжимаю матрицу во время загрузки, я не ожидаю получить ту же матрицу, но такую, которая ведет себя одинаково в пределах определенного порога. Я нашел эту статью, которая сжимает матрицы для компьютерной анимации в качестве примера. irving/papers/seo2011_compression.pdf   -  person user1148583    schedule 14.01.2012
comment
Вы беспокоитесь только о быстром доступе к большим данным?   -  person Osman Turan    schedule 14.01.2012
comment
Нет, это должно быть с потерями, потому что я уже сжимаю данные с помощью алгоритма без потерь, и этого недостаточно.   -  person user1148583    schedule 15.01.2012
comment
Вам действительно нужно рассказать нам больше о данных и о том, как к ним получить доступ, прежде чем кто-либо сможет дать полезный ответ.   -  person Nick Johnson    schedule 16.01.2012


Ответы (1)


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

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

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

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

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

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

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

person Cyan    schedule 14.01.2012