VLDB 2023 | 基于擦除的浮点无损压缩(附论文和源码)

article/2025/10/29 11:46:54

大量浮点时间序列数据正以前所未有的高速率生成。一种高效、紧凑、无损的时间序列数据压缩方法对海量数据的应用场景至关重要。现有的大多数浮点无损压缩方法是基于异或操作,但它们没有充分利用尾随零,这通常会导致压缩率不尽如人意。本次为大家带来重庆大学START团队在数据库领域顶级会议VLDB 2023最新收录的论文《Elf: Erasing-based Lossless Floating-Point Compression》。

一.背景

传感设备和物联网的发展带来了时间序列数据的爆炸增长。例如,波音787上的传感器每次飞行可以产生高达0.5 TB的数据。这些庞大的浮点时间序列数据如果以原始格式传输和存储,将占用大量的网络带宽和存储空间,降低系统效率。

一种有效的方法是在传输和存储之前对时间序列数据进行压缩。通用压缩算法如LZ4和Xz,虽然可以达到很好的压缩率,但没有利用时间序列数据的内在特征,而且他们只能按照批处理模式运行,非常耗时,且不太适合流式时间序列数据。针对流式浮点时间序列数据的压缩方法有两类,即有损压缩算法和无损压缩算法。但有损压缩算法会丢失一些信息,不适合科学计算、数据管理、网络传输等关键场景。针对流式浮点数据的无损压缩通常基于异或运算,典型的算法如Gorilla和Chimp。Gorilla假设连续两个浮点值的XOR结果很可能有许多前导零和尾随零。但据我们统计大多数情况下,XOR结果只有很少的尾随零,如图1所示。

图1 尾随零数量统计

为了增加XOR结果的尾随零的数量,我们提出了一种基于擦除的无损浮点压缩算法ElfElf的基本思想是通过擦除浮点值的最后几位(即设置为零),获得一个带有大量尾随零的XOR结果。Elf面临三个挑战:(1)如何快速确定被擦除的位;(2)如何无损地恢复原始浮点数据;(3)如何压缩擦除的浮点数据。通过严格的理论分析,Elf可以快速确定被擦除的位,并在没有任何精度损失的情况下恢复原始浮点值,如图2所示。针对大量尾随零的XOR结果,论文提出了一种详细的编码策略,进一步提高压缩性能。

图2 ELF擦除和恢复示例

二.方法介绍

2.1 总体框架

图3显示了Elf算法的总体框架,由擦除器、压缩器、解压器和恢复器组成。在压缩过程中,尽可能多地擦除数据vi的尾随零,由此可以得到一个擦除值v’i,并使用少量比特对XOR结果Δ'进行编码。解压缩过程相当于压缩的逆过程,根据Δ'和解压得到的擦除值v’i,可以无损恢复原数据vi。

图3 总体框架图

2.2定义

(1)先导零、尾随零和中心位:如图4所示,先导零为XOR结果Δ的底层格式中,第一个1之前的所有零;尾随零为Δ最后一个1之后的所有零;中心位为先导零和尾随零之间的数据。

图4 基于XOR压缩方式的实例

(2)小数位数、十进制有效计值位数和十进制有效值起始位置:给定v的十进制格式

,小数位数DP(v) = |l|;dn-1是第一位不等于0的,则SP(v) = n−1称为十进制有效值起始位置;十进制有效值位数DS(v) = nl = SP(v)+1−l。例如DP (3.14) = 2, DS (3.14) = 3, SP (3.14) = 0; DP (−0.0314) = 4, DS (−0.0314) = 3, SP (−0.0314) = −2; DP (314.0) = 1, DS (314.0) = 4, SP (314.0) = 2.

(3)尾数前缀数MPN(Mantissa Prefix Number):一个双精度浮点数v有尾数部分

,另有双精度浮点数v’有尾数部分,若v’尾数前半部分与v相同,尾数后半部分全为零,则称v'为v的尾数前缀数。

2.3 Elf擦除器

给定一个双精度值v,其十进制格式为

,我们可以找到它的一个尾数前缀v’和一个很小的双精度值δ,0≤δ<10α,使得v’=vδ。如果保留v’和δ的信息,可以不损失任何精度地恢复v

一方面,一个数可以有多个尾数前缀。论文的目标是最大化XOR结果的尾随零数量,故选择具有最多尾随零的最优尾数前缀。

另一方面,δ的计算和存储可以省略。若δ≠0并且十进制小数位数DP(v)已知,假设α=DP(v)和

,我们有

其中

是在DF(v')中省略d-α后的数字。δ=0表示v本身有很长的尾随零,因此不进行擦除操作。

(1)尾数前缀搜索:无论是迭代查找还是改进的二分查找,其时间复杂度都较大。论文提出了一种新的尾数前缀的搜索方法,该方法只需要O(1)的时间复杂度。

定理1:

其中,

意味着十进制数10-α正好需要f(α)位之后的二进制数来近似表示。根据论文的定理1,vδ可以认为是在v的二进制格式BF(v)中擦除b-f(α)后面的位。又由IEEE754格式可知,一个双精度浮点数的二进制格式中小数点后的每一位,均能与IEEE754格式中的尾数部分一一对应,且公式为,其中。故BF(v)中b-f(α)对应IEEE754格式中m-g(α),且

因此,通过擦除双精度值v的底层格式m-g(α)之后的数,可以快速获得最优尾数前缀v’。

(2)小数位数计算:IEEE754标准下,最小的双精度浮点数表示为4.9×10-324,故直接存储αDP(v)需要9bits。实际上,双精度浮点数能精确表示的十进制数的有效值位数βDS(v) ≤ 17,且

,因此存储β能减少比特数使用。

定理2:

定理3:

根据论文中的定理2和定理3,可以在未知原始值v的情况下求得小数位数α

又v=10-i等价于v=10SP(v),v可以通过

直接求得。

此处修正十进制有效值位数ββ*:

β*∈{0,1,2,…,17},有18种取值。根据以下定理4:

可知被擦除位数x依赖于β。若β≤14,至少可以擦除⌈51−14×log210⌉= 5位,保证了正增益;若β≥16,最多只能擦除⌊53−(16−1)×log210⌋= 3位,导致负增益。因此,不考虑β*= 16或17的情况,利用4bits来记录 β*。

为了保证增益为正,当βDS(v) ≥ 16且52 − g(α) ≤ 4(被擦除位数小于等于4位)时,不进行擦除操作。

v的恢复总结为

其中α = β*- (SP(v’)+1)。

(2)擦除算法:算法1给出了尾数擦除过程的伪代码。算法使用1bit作为标志来指示是否擦除了v,将双精度值v和输出流out作为输入。首先,计算小数位数α和修正后的有效值位数β*,并通过提取v的最后52 − g(α)位尾数位得到δ

如果这三个条件同时成立(即:β* < 16,δ≠ 0和52 − g(α) > 4),则输出流out写入1位flag“1”,然后写入4位的β*作为v的恢复使用。通过擦除v的最后52 − g(α)位尾数得到v'。否则,输出流out写入1位flag“0”,不做任何修改将v'赋值为v

最后,获得的v’与out一起传递给基于XOR的压缩器进行进一步压缩。

2.4 Elf恢复器

Elf恢复器是Elf擦除器的逆过程。算法2描述了Elf恢复器的伪代码,它接受一个输入流in。首先,从输入流in中读取1bit来获得修改标志flag,它有两种情况:

(1)如果flag等于0,则没有修改原始值,因此从基于XOR的解压器中获取一个值并将其直接赋值给v

(2)否则,我们从输入流in中读取4bits得到修正后的有效值位数β*,然后从基于XOR的解压器中得到一个值v'。如果β* = 0,v = 10-(sp(v' )+1);. 如果β* ≠ 0,根据算法中等式(7)和等式(4)从β*和v'中恢复v

最后,返回恢复的v

2.5 Elf压缩器

由于被擦除的值v’往往包含长尾零,为了压缩时间序列,论文提出了一种新的基于XOR的压缩器和相应的解压器。

第一个值的压缩:经擦除后v’1有大量的尾随零,利用⌈log265⌉= 7位来记录v’1尾随零trail的位数,并以64-trail位存储v’1的非尾随零部分,总计使用71-trail位来记录第一个值,这通常小于64位。

其他值的压缩:论文提出的基于XOR的压缩器是在Gorilla的基础上扩展的,同时借鉴了Chimp的一些思想。

(1)Gorilla压缩器:如图5(a)所示,如果xort = 0 (即v’t = v’t-1),写1位“0”,不再存储v’t。如果xort ≠ 0,写1位“1”,进一步检查条件C1:leadt≥ leadt-1 与 trailt ≥ trailt-1是否满足(即xort的前导零位数和尾随零位数均大于或等于xort-1)。如果C1不成立,再写一位“1”,并分别用5bits和6bits存储前导零位数和中心位位数,然后是实际的中心位数据。否则,xort与xort-1共享前导零位数和中心位位数。

(2)前导零优化:由于XOR值的前导零位数很少大于30或小于8,Chimp仅使用3位来表示最多24个前导零,即用0、8、12、16、18、20、22、24来近似表示前导零位数。如果实际的前导零位数在0到7之间,Chimp将其近似为0,以此类推。因此C1条件转化为C2:leadt= leadt-1 与 trailt ≥ trailt-1。将此优化应用于Gorilla压缩器,如图5(b)所示。

(3)中心位优化:XOR值通常具有较长的尾随零和前导零,而中心位不超过16位。因此,如果中心位位数小于或等于16,使用log216 = 4位对其进行编码。相比原始解决方案,通常可以节省一个比特。如图5(c)所示。

(4)标志位重分配:前面只使用1位标志位来表示xort = 0的情况,但对于xort ≠ 0的情况,使用了2或3位标志位。但在浮点时间序列中,相同的连续值并不常见,仅使用1位来表示xort = 0的情况并不是特别有效。如图5(d)所示,为每个情况重新分配了标志位。

图5 对v't(t≠1)进行ElfXORcmp的优化过程

算法3描述了ElfXORcmp的伪代码。在第1-4行中,处理时间序列的第一个值,在第6-22行中,分别处理图5(d)所示的四种情况。

2.6 Elf解压器

解压缩的过程和与压缩相反。如算法4所示,解压器Elf XORdcmp以输入流in作为输入,在第1-3行中解压缩第一个值,并在第5-17行中分别处理四种不同情况。

对于case01,算法将当前值v’t设置为先前值v’t-1。对于case 00、case 10和case 11,首先更新前导零位数leadt和中心位位数center,从而求得当前值v’t。最后,返回v’t到Elf恢复器。

三.实验

论文采用22个数据集,包括14个时间序列和8个非时间序列,并根据平均十进制有效值位数β分为大、中、小三类。

论文将Elf压缩算法与四种无损浮点压缩方法(Gorilla、Chimp、Chimp128和FPC)和五种通用压缩方法(Xz、Brotli、LZ4、Zstd和Snappy)进行了比较。并通过将Elf擦除器作为预处理步骤,比较了Gorilla、Chimp和Chimp128的三个变体算法,以验证擦除和XORcmp策略的有效性。

此外,论文从压缩率、压缩时间和解压时间这三个指标来验证各种算法的性能。

3.1 压缩率

从图6实验结果观察可知,相比无损浮点压缩算法,Elf在几乎所有的数据集上都有最好的压缩率,无论是时间序列数据集,还是非时间序列数据集,其中对于时间序列数据集,Elf的压缩率相对于Gorilla和FPC平均相对提高了51%,并分别比Chimp和Chimp128获得47%和12%的相对改善;Elf与通用压缩算法在压缩率上旗鼓相当,甚至相比LZ4和snappy有明显优势;而对于large β的数据集,所有压缩算法的压缩率均不理想。

图6 压缩率比较

3.2 压缩时间与解压时间

观察图7实验数据,可以发现通用压缩算法的平均压缩时间比浮点压缩算法多一到两个数量级,因此无法应用于实际场景;Elf在压缩和解压缩过程中都比其他浮点压缩算法花费了更多的时间,增加了一个擦除步骤和一个恢复步骤,但压缩时间和解压时间都在同一个数量级上,差异并不明显。

图7 压缩时间与解压时间比较

3.3 Elf相比Chimp128的效率提升

考虑一个数据传输场景:假设原始数据大小为D,压缩率为η,压缩速率、解压缩速率、传输速率分别为rcmp、rdcmp、rtr。数据收发的总延时时间为t =D/rcmp + D/rdcmp + D×η/rtr 。由上述数据可得

,当传输速率rtr小于6.17 × 107bits/s时,Elf的总体性能优于Chimp128。在典型的CS架构中,一个连接的带宽很少超过6.17 ×107bits/s,且对于每个连接,Chimp128将分配33KB的内存,这对于高并发场景是负担不起的。

3.4 不同β值的性能表现

为了进一步研究β的影响,通过逐步减少时间序列数据集AS和非时间序列数据集PLon的十进制有效值位数β进行了一组实验,并选择Chimp128和Snappy作为基准。

如图8所示,β在3和13之间时,Elf总是保持最好的压缩率。当β= 6时,Elf相对于Chimp128和Snappy的压缩率增益最高。对于不同的βElf的压缩时间比Chimp128稍长,但比Snappy短得多。虽然Elf的解压时间大约是Chimp128的两倍,但始终小于60μs。

图8 不同β的性能表现

3.5 验证擦除和XORcmp策略

为了验证擦除策略的有效性,我们将Elf擦除器作为对Gorilla、Chimp和Chimp128的预处理操作。

如图9所示,对于β较小或中等的数据集,擦除策略都可以显著提高Gorilla和Chimp的压缩率,但Chimp128几乎不能从擦除策略中受益。对于β较大的数据集,Elf擦除器不能增强基于XOR的压缩器的压缩率。

β不是很大的情况下,Elf压缩算法比经过Elf擦除器优化过的Gorilla和Chimp算法甚至提高了8.7% ~ 33.3%,由此验证了XORcmp优化策略的有效性。

图9 擦除和XORcmp策略对压缩率的提升

四.总结

本文介绍了Elf,一种新颖、紧凑、高效的基于擦除的流式浮点类型无损压缩算法。使用22个数据集的大量实验验证了Elf的强大性能。实验结果表明,Elf比Chimp128和Gorilla的平均相对压缩率分别提高了12.4%和43.9%。此外,Elf具有与最好的通用压缩算法相似的压缩率,而所需的时间要少得多。

-End-

本文作者

朱明辉

重庆大学计算机科学与技术专业准研究生,重庆大学START团队成员。主要研究方向:时空数据挖掘


时空艺术团队START,Spatio-Temporal Art)来自重庆大学时空实验室,旨在发挥企业和高校的优势,深入探索时空数据收集、存储、管理、挖掘、可视化相关技术,并积极推进学术成果在产业界的落地!年度有2~3名研究生名额,欢迎计算机、GIS等相关专业的学生报考!

关注“时空实验室”公众号,回复“VLDB_2023_ELF”获取论文

转载请注明:康瑞部落 » VLDB 2023 | 基于擦除的浮点无损压缩(附论文和源码)


http://chatgpt.dhexx.cn/article/VyfTjbRK.shtml

相关文章

运算符—逻辑运算符

目录 5.逻辑运算符 5.1逻辑运算符概述 5.2短路逻辑运算符 5.逻辑运算符 &#xff08;学完之后要求能够使用逻辑运算符完成逻辑运算&#xff09; 5.1逻辑运算符概述 在数学中&#xff0c;一个数据x&#xff0c;大于3&#xff0c;小于6&#xff0c;我们可以写为这样来表示&am…

C语言关系运算和逻辑运算

一、关系运算 1.关系运算符 每个关系运算符对它左侧值和右侧值进行比较大小的运算 2.关系表达式 用关系运算符连接起来的式子。 若关系为真&#xff0c;关系表达式的值为1&#xff1b; 若关系为假&#xff0c;关系表达式的值为0&#xff1b; 3.优先级 关系运算符优先级低于算术…

C语言复习--逻辑运算符|| 和,!

&& 只有两个条件都为真时&#xff0c;才为真。||只要一个为真&#xff0c;就为真。 逻辑运算符很重要的法则是短路法则。 逻辑运算符的运算顺序都是从左到右计算。 && 当左侧条件为假时&#xff0c;就不计算右侧。 || 都左侧条件为真时&#xff0c;就不计…

C语言:关系运算符逻辑运算符

本节的所讲解的符号&#xff0c;大家在生活中应该都有用过&#xff0c;像我们去商场买东西&#xff0c;都会比较一下价格&#xff0c;是不是相等啊&#xff0c;哪家的贵&#xff0c;哪家的便宜啊。 在C语言中程序中也存在这样的比较&#xff0c;这个时候就需要用到关系运算符了…

C语言逻辑运算符详解

情景模式&#xff1a;现在研发出了一款新的软件&#xff0c;要求使用者必须成年&#xff0c;并且成绩大于等于60&#xff0c;该怎么办呢&#xff1f; 或许你会想到使用嵌套的 if 语句&#xff0c;类似下面这样的代码&#xff1a; #include <stdio.h> int main() {int a…

C 语言 逻辑运算符

文章目录 介绍逻辑运算符一览案例演示 介绍 用于连接多个条件&#xff08;一般来讲就是关系表达式&#xff09;&#xff0c;最终的结果要么是真(非 0 表示)&#xff0c;要么是 假(0 表示) 。 逻辑运算符一览 下表显示了 C 语言支持的所有逻辑运算符。假设变量 A 的值为 1&am…

☀️光天化日学C语言☀️(11)- 逻辑运算符 | 我是一个有逻辑的人

&#x1f649;饭不食&#xff0c;水不饮&#xff0c;题必须刷&#x1f649; C语言免费动漫教程&#xff0c;和我一起打卡&#xff01; &#x1f31e;《光天化日学C语言》&#x1f31e; LeetCode 太难&#xff1f;先看简单题&#xff01; &#x1f9e1;《C语言入门100例》&#…

C语言逻辑运算符介绍和示例

文章目录 1、逻辑运算符介绍2、逻辑表达式的书写3、不得不说的逻辑非4、获取视频教程5、版权声明 1、逻辑运算符介绍 在日常生活中&#xff0c;要做出某个决定&#xff0c;需要判断的条件往往不止一个&#xff0c;需要判断多个条件&#xff0c;例如超女选秀&#xff0c;参与选…

C语言按位逻辑运算符总结-与、或、非、异或

点击上方蓝字关注我&#xff0c;了解更多咨询 C中有按位逻辑运算符&#xff1a;按位取反、按位与、按位或、按位异或。这4个运算符可以用于整型&#xff0c;包括char类型。按位操作针对每一个位进行操作&#xff0c;不影响左右两边的位。4个运算符的作用总结如下&#xff1a; 一…

C语言逻辑运算符和||,一篇文章带你读懂逻辑表达式!

目录 逻辑运算符有哪些&#xff1f; 逻辑运算符的短路特性 逻辑运算符在表达式求值中的问题 逻辑运算符&&、||混合的不同情况 逻辑运算符有哪些&#xff1f; C 语言提供了以下三种逻辑运算符。 一元&#xff1a;&#xff01;&#xff08;逻辑非&#xff09;。 二…

勒让德符号判断二次剩余-C语言

近日备考学习二次剩余理论&#xff0c;其中了解到勒让德符号这个相比欧拉定理更加方便判断一个正整数在一个模数下是否为二次剩余&#xff1b; 基于勒让德符号理论的学习&#xff0c;本文旨在通过程序来实现基于勒让德符号的二次剩余判断方法&#xff1b; 本文着重点在于运算…

二次剩余入门

昨天训练的时候遇到一道题怎么也不会做&#xff0c;在网上搜了题解之后第一次听说了二次剩余&#xff0c;看了一天各种dalao的博客&#xff0c;在这里总结一下自己所理解的二次剩余及其用法。 1&#xff0c;什么是二次剩余&#xff1f; 2&#xff0c;二次剩余有什么用&#xff…

平方剩余(二次剩余)

平方剩余&#xff1a; 设p是奇素数(即大于2的素数)&#xff0c;如果二次同余式 有解&#xff0c;则a称为模p的平方剩余&#xff0c;否则a称为模p的平方非剩余(二次非剩余)(之所以规定p是大于2的素数&#xff0c;是因为p 2时解上面的二次同余式非常容易。 求出p 5&#xff…

二次剩余--欧拉准则

在 数论中&#xff0c; 二次剩余的 欧拉判别法&#xff08;又称 欧拉准则&#xff09;是用来判定给定的 整数是否是一个 质数的 二次剩余。 目录 1 叙述2 举例 2.1 例子一&#xff1a;对于给定数&#xff0c;寻找其为二次剩余的模数2.2 例子二&#xff1a;对指定的质数p…

二次剩余问题x的求解及代码实现(python)

一、问题引入 二次剩余是数论基本概念之一。它是初等数论中非常重要的结果&#xff0c;不仅可用来判断二次同余式是否有解&#xff0c;还有很多用途。C.F.高斯称它为算术中的宝石&#xff0c;他一人先后给出多个证明。 [1] 研究二次剩余的理论称为二次剩余理论。二次剩余理论…

二次剩余(学习笔记)

就是用来求解 x 2 ≡ n &VeryThinSpace; m o d &VeryThinSpace; p x^2\equiv n \bmod p x2≡nmodp的一个方法 对 p p p进行分类讨论&#xff1a; p 2 p2 p2 &#xff0c;则 x n xn xn p p p为奇素数 勒让德符号&#xff1a; ( a p ) { 1 a 在 模 p 意 义 下 是 二…

(转载)二次剩余(知识总结+板子整理)

思路来源 https://blog.csdn.net/kele52he/article/details/78897187&#xff08;二次剩余&#xff09; https://blog.csdn.net/stevensonson/article/details/85845334&#xff08;二次剩余&#xff09; https://blog.csdn.net/skywalkert/article/details/52591343?locat…

二次同余方程(二次剩余)

文章目录 一、介绍1.定义2.定理 二、判别1.勒让德符号&#xff08;Legendre Symbol&#xff09;2.欧拉判别准则&#xff08;Eulers criterion&#xff09;(1)内容(2)证明(3)注意 三、 x 2 ≡ n ( m o d x^2≡n(mod x2≡n(mod p ) p) p)——奇波拉算法&#xff08;Cipollas alg…

二次剩余 数论 勒让德

在数论中&#xff0c;特别在同余理论里&#xff0c;一个整数对另一个整数的二次剩余&#xff08;英语&#xff1a;Quadratic residue&#xff09;指的平方除以得到的余数。 当存在某个&#xff0c;式子成立时&#xff0c;称“是模的二次剩余” 当对任意&#xff0c;不成立时&…

二次剩余

title: 二次剩余 date: 2019-08-27 00:10:46 tags: 数论 一、定义&#xff08;Quadratic_residue&#xff09; 一个整数X对另一个整数p的二次剩余 d 注意这边的取模是 X 2 X^2 X2 和 d 都要对p取模噢 eg. 3 2 ≡ 2 ( m o d 7 ) 3^2≡2 (mod\ 7) 32≡2(mod 7),我们称 2是7的…