倒排索引压缩:改进的PForDelta算法
2015-07-17 08:08
956 查看
由于倒排索引文件往往占用巨大的磁盘空间,我们自然想到对数据进行压缩。同时,引进压缩算法后,使得磁盘占用减少,操作系统在query processing过程中磁盘读取效率也能提升。另外,压缩算法不仅要考虑压缩效果,还要照顾到query processing过程的解压缩效率。
总的来说,好的索引压缩算法需要最大化两个方面:
1、减少磁盘资源占用
2、加快用户查询响应速度
其中,加快响应速度比减少磁盘占用更为重要。本文主要介绍PForDelta压缩算法,其简单易懂,能够提供可观的数据压缩,同时具备非常高的响应速度,因此广泛的运用于很多实际信息检索系统中。
step1B4
step2A4
总的来说,好的索引压缩算法需要最大化两个方面:
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
相关文章推荐
- Codeforces Round #312 (Div. 2)
- 【mongodb系统学习之六】mongodb配置文件方式启动
- hdoj 2183 奇数阶魔方(II) 【模拟】+【法】
- hdu 1269 迷宫城堡 判断强连通分量数目 tarjan算法
- 使用正确的筛选参数来提高查询性能
- 二叉树的非递归遍历(前序、中序、后序)
- MVC+WCF框架下广告位管理——文件上传
- 图片的等比缩放和Logo水印
- 码表由来:ascll码-Gbk2312-GBK-Unicode-UTF-8
- 码表由来:ascll码-Gbk2312-GBK-Unicode-UTF-8
- 为了理想,我放弃了一切!
- #openstack-meeting: swift(2015-07-15)
- Windows App开发之常用控件与应用栏
- 早上好
- 针对HTTPS的理论攻击正变得实用
- IOS设计模式之工场模式
- HDU 1028 HDU Ignatius and the Princess III
- gtk程序运行报 main_loop!=NULL 错误的解决办法
- gtk程序运行报 main_loop!=NULL 错误的解决办法
- gtk程序运行报 main_loop!=NULL 错误的解决办法