`
suichangkele
  • 浏览: 200288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

packedints总结

阅读更多

先总结下之前3篇介绍mutable的文章,mutable可以分为两大类,一类是packed,一类是packed_single_block,前者是永远不会浪费空间的,每个数字的存储都是紧密连接的,后者可能会浪费空间,所以为了尽可能少的浪费空间,它对bitsPerValue做了限制,只提供部分的bitsPerValue。两者的共同点是都是使用多个数字来表示多个数字,有的用byte[],有的用short[],有的用int[],还有的用long[]。packed的按照一个数字跨不跨越存储的数字还可以分为两种,一种是不跨越的,比如Direct8 Direct16这种,还有是跨越的,比如Packed16ThreeBlocks,用三个byte表示一个数字,还有packed64,这个所有的数字都是严格按照头尾相接的方式存储的。对于packed的这种,因为不能浪费空间,所以Direct8 Direct16 Direct32 还有Packed16ThreeBlocks Packed8ThreeBlocks能够存储的bitsPerValue是有条件的的,对于奇数的这种,比如7,就没法使用,这个时候只能用packed64,这个也是org.apache.lucene.util.packed.PackedInts.fastestFormatAndBits(int, int, float)方法的核心思想,对于应付不了的数字,只能靠packed64。packed_single_block这种是用long[]来实现的,一个数字不会跨越多个long,当添加时从一个long的低位开始添加,而packed64是从高位添加的。

 

mutable的本意就是打包的数字,所以他出现在packedInts这个类中,他的用处有很多,典型的就是PackedLongValues,这个类中就是保存了很多个mutable,可以将其看做是一个数组,可以根据下标获得数字。当然每个mutable也可以看做是一个数组。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics