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