文档章节

结合lucene谈谈日期的压缩问题

F
 FAT_mt
发布于 11/15 20:07
字数 496
阅读 1
收藏 0

说起日期值的压缩,一般容易想到的办法是将日期转化成long类型,然后再通过变长整形进行压缩,我算了一下按照毫秒来算最多占用5个字节(可以通过“谈谈变长整型”中的表查看),确实节省了部分空间,但是还有优化的余地,因为实际情况下日期可能只精确到秒、小时或者天。

lucene里用1个字节header中的前3位表示可能出现的5种情况:

1、时间精确到毫秒   header前3位值为000

2、时间精确到天      header前3位值为110

3、时间精确到小时   header前3位值为100

4、时间精确到秒      header前3位值为010

5、最后一种情况lucene是把long类型的值当作普通的值来对待,也就是可能有负数,因此首先把long值经过zigzag进行编码将负数转正,然后利用header剩下的5位存储zigzag编码后的5位值,如果剩余的位值不等于0,header前3位值为001,并且将剩余的位值按照变长整形进行压缩。lucene里面的long类型即可对日期压缩也可对普通的值压缩,有兴趣的可以查看源码:

 int header; 
    if (l % SECOND != 0) {
      header = 0;
    } else if (l % DAY == 0) {
      header = DAY_ENCODING;
      l /= DAY;
    } else if (l % HOUR == 0) {
      header = HOUR_ENCODING;
      l /= HOUR;
    } else {
      header = SECOND_ENCODING;
      l /= SECOND;
    }

    final long zigZagL = BitUtil.zigZagEncode(l);
    header |= (zigZagL & 0x1F); // last 5 bits
    final long upperBits = zigZagL >>> 5;
    if (upperBits != 0) {
      header |= 0x20;
    }
    out.writeByte((byte) header);
    if (upperBits != 0) {
      out.writeVLong(upperBits);
    }

© 著作权归作者所有

共有 人打赏支持
F

FAT_mt

粉丝 1
博文 27
码字总数 16036
作品 3
南京
高级程序员
私信 提问

暂无文章

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
37分钟前
6
0

中国龙-扬科
昨天
1
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
5
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部