Учитывая характер ваших данных, похоже, вы работаете с каким-то необработанным образцом. Таким образом, самый простой и наиболее общий метод «с потерями» будет состоять в том, чтобы отбрасывать младшие биты, уменьшая точность до желаемого уровня.
Обратите внимание, что вам нужно будет «отбросить младшие биты», что сильно отличается от «округления до следующей степени 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