前日一个朋友给我发来了一个索引压缩算法,写得非常漂亮而且简洁,压缩比和解压性能方面大大超过目前已知的一些字节对齐的算法和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,