Page 88 - 《软件学报》2021年第5期
P. 88

1312                                     Journal of Software  软件学报 Vol.32, No.5,  May 2021

                 的内存空间.Entry 用于存储内存块在数据文件中的首地址以及 LogView 在块内的偏移量.图中 8byte 的前 40bit
                 用于存储内存块的首地址 headAddress,后 24bit 用于存储块内偏移量 offset.在计算机系统中,地址的编码是以字
                                                                                               24
                 节为最小单位,故 40bit 可表示最大 1TB 的磁盘文件大小;而后 24bit 用于存储块内偏移量,可表示 2 字节量大
                                                    18
                 小,而内存块的大小的初始值设置为 256KB(2  byte),所以 24bit 完全满足要求.



















                                              Fig.7    Creation and usage of indexing
                                                  图 7   索引的创建与使用
                    在理解一级索引与二级索引的结构之后,以一条 LogView 为例,说明索引的创建过程和索引的查询过程.
                    •   索引创建过程
                    在内存块写入数据文件中后,需要针对 LogView 的 id 创建索引并存储内存块在数据文件中的首地址和日
                 志在块内的偏移量.图 7 中可以清晰地看出一级索引与二级索引在内存中的关系,它们都在内存中的同一个字
                 节数组中,所以索引构建过程主要是对字节数组进行操作.创建索引的过程如下.
                    (1)  在根据 LogView 的 id 获取到 ip 与 index 值后,拼接“ip”与“index/4K”成为 8 字节的数据,表示为 A.
                    (2)  遍历所有一级索引 Entry 的值,如果存在与 A 值相等的数据,则直接返回对应 Entry 的位置 L;如果不存
                        在,则顺序添加一个新的 Entry 值 A,对应 Entry 的位置为 L,并创建一个对应 Segment 索引.
                    (3)  访问对应的(即第 L 个)二级 Segment 索引,其中具有 4K 个 Entry,计算 index%4K 的值为 T,则将对应
                        Segment 索引中第 T 个 Entry 空间用于存储块的首地址以及块内偏移量.
                    算法 2 的代码完整展示了索引创建中,字节数组的操作过程.
                    算法 2.  索引创建.
                    Input:
                      索引文件读取为完整的字节数组,每个元素(entry)占 8byte:array;
                      id 的组成部分:ip,index;
                      内存块首地址:headAddress;
                      LogView 在内存块中的偏移量:offset.
                    Output:
                      创建完成.
                    function createIndexing(array,ip,index,headAddress,offset)
                      Header←array[0:4K]              //0~4K−1 的 Entry 为一级索引段
                      A←ip+index/4K                   //拼接 ip 与 index 的哈希值
                      addressInfo←headAddress+offset  //高 40 位存首地址与第 20 位存偏移量信息
                      i←1
   83   84   85   86   87   88   89   90   91   92   93