压缩浮点数据

计算科学 数据存储
2021-12-21 20:29:41

有没有专门为压缩浮点科学数据而设计的工具?

如果一个函数是平滑的,那么表示该函数的数字之间显然存在很多相关性,因此数据应该可以很好地压缩。压缩/gzipping 二进制浮点数据并不能很好地压缩它。我想知道是否有专门为压缩浮点数据开发的方法。

要求:

  • 无损压缩或指定要保留的最小位数的可能性(对于某些应用程序double可能超过我们需要的数量,而float可能没有足够的精度)。

  • 经过良好测试的工作工具(即不仅仅是描述理论方法的论文)。

  • 适用于压缩一维数值数据(如时间序列)

  • 跨平台(必须在 Windows 上工作)

  • 它必须很快——最好不要比 gzip 慢多少。我发现如果我将数字存储为 ASCII,压缩文件可以加快读取和处理它的速度(因为操作可能是 I/O 绑定的)。

我特别想听听实际使用过这种工具的人的意见。

4个回答

试试Blosc在许多情况下,它比 memcopy 快这点考虑一下吧。. . 邪恶。

它超级稳定,经过高度审查,跨平台,并且表现得像冠军。

使用HDF5及其 GZIP 过滤器我得到了很好的结果。

HDF5 还提供了一个SZIP过滤器,可以为一些科学数据集实现更好的结果。

根据我的经验,压缩的选择很大程度上取决于数据的类型,而基准测试可能是做出好的选择的唯一方法。

顺便说一句, HDF5的第三方过滤器包括 BLOSC、BZIP2、LZO、LZF、MAFISC。

可以说,您可以将回归或变换方法(傅里叶变换、切比雪夫变换)方法解释为时间序列或一维函数数据的“压缩”。Remez 的算法将是另一个候选者。在这种情况下,通过 FFT 使用回归、FFT 或 Chebyshev 等方法可以满足您的目的。也就是说,这些方法都不适用于具有任意结构的时间序列数据。例如,使用 FFT,您假设有周期性,数据中的任何类型的不连续性(或缺乏周期性)都会导致吉布斯现象类似地,对于切比雪夫变换,假设数据描述了一个函数[1,1].

根据底层函数,您可能能够将数据拟合到函数形式而不会出现错误,描述函数形式所需的系数比您拥有的数据点少(导致压缩)。其中一些方法存在错误结果,尽管我不知道它们中的任何一个是否会给您一个先验(或后验)界限或对错误的估计。

您还可以查看专门为浮点数压缩开发的方法,例如 FPC 和相关算法。请参阅此处此处此处此处此处的论文,以及包含旧源代码网页

HDF5 可以使用“混洗”算法,其中 N 个浮点数的字节被重新排列,以便 N 个数字的第一个字节在前,然后是第二个,依此类推。这在应用 gzip 后会产生更好的压缩比,因为它更有可能产生相同值的更长序列。请参阅此处了解一些基准