我必须编写一个管理非常大的数据集的工具(对于普通的工作站来说很大)。我基本上需要与jpeg格式相反的东西。我需要数据集在磁盘上完好无损,它可以任意大,但是当它在内存中读取时需要进行有损压缩,并且只有在任何给定时间使用的子部分需要在飞行中解压缩。我已经开始关注ipp(英特尔集成性能基元),但现在还不是很清楚我是否可以将它们用于我需要做的事情。 有人能指出我正确的方向吗?
谢谢。
答案 0 :(得分:0)
鉴于您的数据的性质,您似乎正在处理某种原始样本。 因此,最简单,最通用的“有损”技术是降低低位,降低精度,达到你想要的水平。
请注意,您需要“删除低位”,这与“舍入到下一个10的幂”完全不同。计算机在基础2上工作,并且您希望所有低位都是“00000”,以便尽可能地执行压缩。此方法假设所选的压缩算法将使用可预测的0位模式。
另一种更复杂,更具体的方法可能是将您的值作为索引转换为表。优点是您可以根据需要“定位”精度。明显的缺点是该表将特定于分布模式。
除此之外,如果它们之间存在任何关系,您也可以不存储值本身,而是存储值与其前一个值的增量。这也有助于压缩。
对于要压缩的数据,您需要使用适当大小的数据包(例如64KB)对它们进行“分组”。在单个字段上,没有压缩算法可以为您提供合适的结果。反过来,这意味着每次要访问字段时,都需要解压缩整个数据包,因此根据您要对其进行的操作进行更好的调整。在这种情况下,顺序访问更容易处理。
关于压缩算法,由于这些数据将是“实时”的,因此您需要非常快速的内容,因此访问数据的延迟影响非常小。
有几种开源替代品可供使用。为了便于许可管理,我建议使用BSD替代方案。由于您使用C ++,以下适合: http://code.google.com/p/snappy/ 和 http://code.google.com/p/lz4/