您的位置:首页 > 其它

倒排索引压缩:改进的PForDelta算法

2015-07-17 08:08 956 查看
由于倒排索引文件往往占用巨大的磁盘空间,我们自然想到对数据进行压缩。同时,引进压缩算法后,使得磁盘占用减少,操作系统在query processing过程中磁盘读取效率也能提升。另外,压缩算法不仅要考虑压缩效果,还要照顾到query processing过程的解压缩效率。

总的来说,好的索引压缩算法需要最大化两个方面:

1、减少磁盘资源占用

2、加快用户查询响应速度

其中,加快响应速度比减少磁盘占用更为重要。本文主要介绍PForDelta压缩算法,其简单易懂,能够提供可观的数据压缩,同时具备非常高的响应速度,因此广泛的运用于很多实际信息检索系统中。

待压缩的倒排索引数据

一个posting单元由<DocID、TF、Term position…>组成。对于每个DocID,其保存在硬盘中的大小取决于文件集最大文档编号的大小。这样造成编号较小的DocID分配了和编号较大的DocID(上百万)一样的存储空间,浪费了资源。由于每个posting是根据DocID顺序存储,所以不需要保存DocID,只需要保存前后两个DocID的差值,这样可以大大减小DocID储存空间,这种方式成为Delta Encoding。如下图:

step1B4

void PForDecompressor::step2A4(unsigned b)
{
unsigned block1,block2;
while(true)
{
if(data_length_<=1) break;
block1 = *(data_++);
block2 = *(data_++);
data_length_ -= 2;
res_[block1 & 255]+=( (block1>>8) + ((block2 & 255)<<24) )<<b;
if(data_length_ == 0) break;
block1 = *(data_++);
data_length_--;
res_[(block2>>8) & 255]+=( (block2>>16) + ((block1 && 65535)<<16) )<<b;
if(data_length_ == 0) break;
block2 = *(data_++);
data_length_--;
res_[(block1>>16) & 255]+=( (block1>>24) + ((block2 && 16777215)<<8) )<<b;
if(data_length_ == 0) break;
block1 = *(data_++);
data_length_--;
res_[block2>>24]+=block1;
}
}


step2A4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: