记一次zlib在工作中的使用情况

场景:

由于fdt中的chunk(原始数据)较大,所以需要对其压缩存储。

做法:

参考lucene中压缩过程,发现是在每次生成chunk时对其进行压缩操作,最后写入磁盘上。

解压的过程是在读取fdt文件时,加载原始数据域值时,进行解压缩。

忽略掉lucene中分片压缩的操作,仅对于生成chunk进行一次压缩,此处压缩采用的便是zlib库。

改动:

在项目中,改动如下:

压缩过程较为简单,在flush函数中操作,只需要适配compress()函数参数即可。

但是解压缩uncompress第三个、第四个参数,需要获取数据(磁盘上压缩之后的那一段数据,即,所有的chunk,此处需要偏移才能取到)才能实现解压缩的过程,所以这里对fdt数据结构进行了小的改动。

增加了一个vector<int32_t>用来保存压缩之后数据的大小,下标为所在chunk,存储值为每个chunk之后的压缩长度。

在最后的finish中,num_chunk,dirty_chunk之后将该数据结构写入到磁盘中,

解压缩,即在读取的过程中需要解压缩,还原数据。

通过fdx索引文件,取得压缩之后chunk在fdt文件的结束位置。将其与起始位置相减,得到真实数据长度。

根据文档ID获取到所在chunk,进而得到压缩长度。

再利用zlib库的uncompress函数,得到真实数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值