PForDelta索引压缩算法的实现

本文介绍了PForDelta索引压缩算法的实现,包括pack3和unpack3的详细过程,以及如何处理非2的幂的位宽。该算法在压缩比和解压性能上表现出色,特别适合处理包含大量0值的情况。文中提供了部分源代码,并提到作者朋友正寻求最快的Pfordelta算法进行PK。
摘要由CSDN通过智能技术生成

      前日一个朋友给我发来了一个索引压缩算法,写得非常漂亮而且简洁,压缩比和解压性能方面大大超过目前已知的一些字节对齐的算法和Pfordelta这样的非字节对齐的算法,让人叹为观止,这是我看到的最好的压缩算法,他将会以论文的形式发表,相信必将震惊世界,我之前也写了很多Pfordelta的博客,大家对这个算法的具体实现很好奇,有几个难点,一个是bit pack和unpack,一个是关于exception的占位符在做链接的时候如果间隔超过了2的b次方如何处理等等,在以前的博客中曾应用了一个日本开发者开发的算法,但目前已经不开源了,我昨天又读了一遍pfordelta实现方面的论文【Super-Scalar RAM-CPU Cache compression】,今天一天写了个大概,bit pack和unpack在1,2,4,8,16...这种2的幂是比较容易处理的,其余的比较困难,我这里只实现了pack3和unpack3,论文【Balancing Vectorized Query Execution with Bandwidth-optimized Storage】中给出了unpack12的参考代码,理论上应该实现从pack3到pack16的全部方法,限于博客篇幅不全写了,有兴趣读者朋友依葫芦画瓢可以继续完成。

      值得注意的是:(1)PFORDelta可以对0值进行压缩,这是非常有利的。(2)pack和unpack的函数指针数组也比较有特色,PACK[bitwidth](code,data,MAX);通过bitwidth值来取相应的pack和unpack函数,提高CPU流水线的通畅性。

      算法本博客不做过多解释,有兴趣的朋友可以参见我此前的博客:

      http://blog.csdn.net/pennyliang/archive/2010/09/25/5905691.aspx

      另外,我这位朋友想让我做一个最快的Pfordelta算法来PK一下,会输多少,我知道肯定会输,而且会很大,只是想尽可能做个最合格的对手,如果有读者朋友有更好的实现,也请发给我参考,非常感谢。

 

#include<stdio.h>
#include<stdlib.h>
#include <stddef.h>
#include <stdint.h>
const int N = 64;
const int MAX = 64;
uint32_t MAXCODE[]={0,
                    1,//1U<<0 - 1
                    3,//1u<<1 - 1
                    (1U<<3) - 1,
                    (1U<<4) - 1,
                    (1U<<5) - 1,
                    (1U<<6) - 1,
                    (1U<<7) - 1,
                    (1U<<8) - 1,
                    (1U<<9) - 1,
                    (1U<<10) - 1,
                    (1U<<11) - 1,
                    (1U<<12) - 1,
                    (1U<<13) - 1,
                    (1U<<14) - 1,
                    (1U<<15) - 1,
                    (1U<<16) - 1,
                    (1U<<17) - 1,
                    (1U<<18) - 1,
                    (1U<<19) - 1,
                    (1U<<20) - 1,
                    (1U<<21) - 1,
                    (1U<<22) - 1,
                    (1U<<23) - 1,
                    (1U<<24) - 1,
                    (1U<<25) - 1,
                    (1U<<26) - 1,
                

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值