场景:
由于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函数,得到真实数据。