压缩浮点数据


26

是否有专门设计用于压缩浮点科学数据的工具?

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

要求:

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

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

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

  • 跨平台(必须在Windows上运行)

  • 它必须 ---最好不慢于gzip。我发现如果我将数字存储为ASCII,则对该文件进行gzip压缩可以加快读取和处理该文件的速度(因为该操作可能受I / O限制)。

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


这部分是受到FLAC的启发的,这表明专门的方法应该比gzip更好(多少?)。
Szabolcs 2012年

我正在看这个
Szabolcs 2012年

整齐。我要给这个旋转一下。
meawoppl

Answers:


22

尝试Blosc。在许多情况下,它比内存复制更快。这点考虑一下吧。。。邪恶。

它是超级稳定,经过高度审查的跨平台的,并且表现出色。


哦,哇,这真的很酷(对我来说是新的!)
Aron Ahmadia 2012年

链接断开。您是否有机会知道现在的位置?
Alexis Wilke

1
@AlexisWilke我修复了链接。这是Google搜索Blosc的第一个结果。
Doug Lipinski

1
Blosc可能很快,但是其在浮点数组上的压缩率却是灾难。通过最佳压缩,它可以提供原始大小的大约98%。无论如何,感谢您的提示。

浮点数组上的压缩在很大程度上取决于内容。我怀疑正在压缩的位中几乎没有(结构化)信息。而且,blosc在5年后仍处于活跃开发中!
meawoppl

7

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

HDF5还提供了一个SZIP滤波器,对于某些科学数据集,它可以获得更好的结果。

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

BTW,用于HDF5 的第三方过滤器包括BLOSC,BZIP2,LZO,LZF,MAFISC。


谢谢答案!我没有用过HDF5。使用具有HDF5格式的gzip过滤器将为我提供与将所有数字写入一个平面二进制文件并通过gzip运行它相同的压缩率是否正确?(现在就忽略使用HDF5可能带来的便利/不便。)关于SZIP,是否以某种方式针对浮点数据集进行了优化?(我很好奇,从浏览链接的页面时并不清楚。)该页面说SZIP的主要优点是速度。GZIP也非常活泼(通常对我来说,gzip的解压缩可以忽略不计)。
Szabolcs 2012年

压缩后的平面二进制文件可能会比带有gzip过滤器的HDF5文件小,因为HDF5不仅仅是原始数据。有时,使用洗牌过滤器进行预处理可以改善gzip结果。但是您是对的,优势确实是更多的便利。使用HDF5,我发现更改压缩过滤器很容易(尝试不同的设置),并且HDF5提供了访问数据子集(时间间隔的时间)的功能。
f3lix

1
如果走这条路,请检查pyTables。它使以上仅几行代码。由Blosc作者维护(至少以前)。
meawoppl

6

[1,1]

根据基础函数的不同,您也许可以将数据拟合为函数形式而不会出错,与描述数据点相比,描述函数形式所需的系数要少一些(导致压缩)。这些方法中的一些存在错误结果,尽管我不知道它们中的任何一个是否可以为您提供关于错误的先验(或后验)界限或估计。

您还可以查看专门为压缩浮点数而开发的方法,例如FPC和相关算法。见文章在这里这里这里这里,并在这里,包含旧的源代码网页一起在这里


实际上,我对类似于gzip的现成工具感兴趣,这些工具不需要我做任何工作,尤其是不需要开发和调整自己的方法。另外,最好是不需要在解压缩之前将整个内容读入内存的方法,因为我可能有可以顺序处理的非常大的数据文件(这适用于gzip,但如果我使用傅立叶,则不行)除非我自己将数据切成块,否则整个事情都会更加复杂。)假设我的数据文件只是一系列二进制双精度数,那将是非常好的。
Szabolcs 2012年

而且这些都是1:1转换,并不是真正的压缩技术。它们可以用来创建数据,而朴素的压缩算法可以更好地处理这些数据,但是独立的解决方案并非如此。
meawoppl

其中一些方法构成了信号处理中使用的压缩算法的数学基础,而这正是答案所在。除特殊情况外,这些转换通常不是1:1。
Geoff Oxberry

3

HDF5可以使用“改组”算法,其中重新排列N个浮点数的字节,以使N个数的第一个字节排在最前面,然后是第二个,依此类推。在应用gzip之后,这会产生更好的压缩率,因为它更有可能产生相同值的更长序列。有关某些基准,请参见此处



1

可以用于浮点压缩的可能方法:

  • 浮点数的转置4xN和double + lz77的转置4xN
    实现:TurboTranspose中的浮点压缩
    另请参见错误边界有损压缩

  • 预测变量(例如有限上下文方法)+编码(例如“整数压缩”)。
    实现:TurboPFor中的浮点压缩,
    包括时间序列的特殊压缩。

  • 如果可能,将所有浮点数转换为整数(例如1.63-> 163),然后使用整数压缩

  • 您可以使用适用 于Linux和Windows 的icapp工具将所有这些方法与数据一起测试。


1

我们一直在将ZFP和HDF5用于我们的医学成像数据。它用于有损浮点压缩。

我们几乎在所有内容上都运行它,并存储(正在使用!)超过40TB的数据。它足够快以实时保存数据,并且我们可以指定所需的精度,因此尽管格式有损,但最终输出中没有任何差异。


0

如果函数是平滑的,则表示该函数的数字之间显然存在很多相关性,因此数据应压缩得很好。

也许您需要的格式仅需要存储从值到相邻值的偏移量。

或者,也许您可​​以利用频域,甚至可以将这些值保存为无损音频文件,例如“ flac lossless”,因为您需要声音具有某些相同的属性。

但是,我将采取另一种方法来尝试回答这个问题,希望对您有所帮助。就像您所说的,表示此数据的最小描述长度还小于提供所有数据点的长度。

https://en.wikipedia.org/wiki/Minimum_description_length

实际上,程序(计算机代码)就是一个很好的例子。而且,如果您不介意主要是通过执行来工作的数据,也可以是代码,那么您可以将浮点值压缩为诸如函数或公式之类的东西。

自动地并且以现实的计算量做到这一点特别困难。但是,Wolfram语言提供了一些尝试此功能的功能:

https://reference.wolfram.com/language/ref/FindSequenceFunction.html https://reference.wolfram.com/language/ref/FindGeneratingFunction.html https://reference.wolfram.com/language/ref/FindFormula。 html

https://reference.wolfram.com/language/ref/RSolve.html


0

为什么不只保存float32 / float16?在numpy中

A.astype( np.float32 )  # 100M: 200 msec imac
A.astype( np.float16 )  # 100M: 700 msec

如果您要在混沌理论中模拟蝴蝶效应,这些功能将无法实现 ,但是它们是可以理解的,可移植的,“不需要我做任何工作”。而float64上的2:1/4:1压缩是很难击败的:)

笔记:

“ np.linalg中不支持数组类型float16”;读入后,必须将其扩展为32或64。

要查看浮点参数有何不同,

import numpy as np
for f in [np.float64, np.float32, np.float16]:
    print np.finfo(f)

有关比较浮点数64 32和16的简单测试用例的图表,请参见 此处

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.