lucene中的PackedInts源码解读-1

本文详细解读了Lucene中的PackedInts源码,探讨了其如何节省空间以及在处理大量数字存储时的作用。通过分析`PackedLongValues.Builder.pack()`方法,解释了数字打包的过程。文章还介绍了`bitsRequired(maxValue)`方法的实现,并着重讲解了如何根据`fastestFormatAndBits`找到合适的format和bitPerValue,最后提到了`Packed64SingleBlock`的创建。由于内容较多,部分内容将在下篇继续讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在看lucene4.x的源码的时候,老是遇见packedInts这个类,当时没有看懂,所以这个周一没事做又看了一下,茅塞顿开,看懂了,记个笔记,装一下B。如果读者认为我的博客中含有错误,请联系我,我的qq是1308567317,以免误人子弟。

顺便说一下,我这里看的是lucene6.6.0的代码。

之前阿帅写个关于博客是写PackedInts,不过他仅仅写了PackedInts的思路和好处,没有深入到代码中,我个人还是感觉不爽,我喜欢一行一行的抠代码酷。PackedInt的好处我这里就不再写了,可以参考帅广应的博客(http://blog.51cto.com/sbp810050504/1531624),我这里重点抠源码。他的优点其实就是一句话——省空间,因为lucene中为了记录他的索引信息,保存了大量的数字,所以如果有更好的保存数字的方式,是可以大量的节省空间的。我们从norm(也就是标准因子)入手,在norm存储在内存的时候,是保存在一个叫做PackedLongValues.Builder的对象内,这个其实是一个生成器模式中的生成器,先保存在他内部的long[]数字里面,当一个数组的长度满足一定值后,就要将数字打包,打包其实就是将数字放入到packedInts里面,因为他省空间.具体的代码为(方法的名字为:org.apache.lucene.util.packed.PackedLongValues.Builder.pack(long[], int, int, float)):

 

void pack(long[] values, int numValues, int block, float acceptableOverheadRatio) {//第一个参数为准备打包的数组,第二个是要打包的数字的个数,第三个是打包后生成的Mutable是第几个(和咱要说的没有任何关系),第四个的是决定使用的Mutable的参数,即保存这些数字使用的空间
	assert numValues > 0;
	// compute max delta
	long minValue = values[0];
	long maxValue = values[0];
	for (int i = 1; i < numValues; ++i) {//循环所有的数字,找出最小值和最大值,方便确定下面的bitPerValue,即最大的一个数字需要多少个位,那么其他所有的数字都不会超过这个位数了
		minValue = Math.min(minValue, values[i]);
		maxVa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值