Lucene索引过程中的内存管理与数据存储

Lucene的索引过程分两个阶段,第一阶段把文档索引到内存中;第二阶段,即内存满了,就把内存中的数据刷新到硬盘上。

/*@xh传入的参数slice与函数体中的buffer指向同一块内存地址。这样做的目的在于编码上清晰。**/publicintallocSlice(finalbyte[]slice,finalintupto){/*@xh*slice[upto]里面存储的是当前slice的结束标志,slice[upto]&15即得到当前层ID。*通过数组NEXT_LEVEL_ARRAY得到下一层的ID,,*通过数组LEVEL_SIZE_ARRAY得到下一层的Slice大小**/finalintlevel=slice[upto]&15;finalintnewLevel=NEXT_LEVEL_ARRAY[level];finalintnewSize=LEVEL_SIZE_ARRAY[newLevel];//Maybeallocateanotherblockif(byteUpto>BYTE_BLOCK_SIZE-newSize){nextBuffer();}finalintnewUpto=byteUpto;finalintoffset=newUpto+byteOffset;byteUpto+=newSize;//Copyforwardthepast3bytes(whichweareabout//tooverwritewiththeforwardingaddress):/*@xh简单翻译就是:把当前Slice结束标志位前面的存储的内容移到下一层Slice的前三个位置**/buffer[newUpto]=slice[upto-3];buffer[newUpto+1]=slice[upto-2];buffer[newUpto+2]=slice[upto-1];/*@xh然后用当前Slice空出来的三个位置连同结束标志位,一共4个Byte,来存储下一层Slice在buffer中起始位置。*这样的话就可以通过当前Slice定位到下一层的Slice**///Writeforwardingaddressatendoflastslice:slice[upto-3]=(byte)(offset>>>24);slice[upto-2]=(byte)(offset>>>16);slice[upto-1]=(byte)(offset>>>8);slice[upto]=(byte)offset;//Writenewlevel://@xh把下一层的结束标志写入。buffer[byteUpto-1]=(byte)(16|newLevel);//@xh返回下一层可用的起始位置(由于下一层的前三个位置已经被占用<参看上面的代码>,所以需要+3)returnnewUpto+3;}

,

本文出自 “每天进步一点点” 博客,请务必保留此出处

一旦有了意志,脚步也会轻松起来。

Lucene索引过程中的内存管理与数据存储

相关文章:

你感兴趣的文章:

标签云: