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

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

                 建立索引的方式写入索引文件中.在第 3.3 节中会详细介绍索引结构的设计思路.


















                                                Fig.5    Storage format of data file
                                                  图 5   数据文件存储格式

                    一条完整的 LogView 持久化到磁盘文件中需要 4 个过程.
                    (1)  记录 LogView 压缩后的字节长度 logSize,使用 4 字节存储日志长度信息并添加到内存块中,添加日志
                        数据到内存块中,并将长度信息的起始位置作为该条日志在块内偏移量 offset 记录下来.
                    (2)  内存块内容超过 256KB 后,内存块首 4 字节数据更新为实际内存块的字节长度 blockSize.
                    (3)  将内存块持久化到文件后,记录下在数据文件中字节块的首地址 headAddress.
                    (4)  将“LogView 在块内的偏移量”、“内存块的首地址”这两项信息存储起来用于创建索引文件.
                    整个过程对应的代码如算法 1 所示.
                    算法 1.  日志写入.
                    Input:
                      一条日志数据:logView;
                      内存块:blockArray.
                    Output:
                      写入成功.
                    function blockWrite(logView,blockArray)
                      logData←compression(logView)         //压缩成字节数据
                      logSize←len(logData)                 //单条 logView 的字节量大小,4 字节表示
                      totalSize←len(blockArray)+logSize+4
                      if totalSize>256KB then
                        //自动扩容到适合大小
                        blockArray.append(logSize)
                        blockArray.append(logData)
                        blockSize←len(blockArray)          //计算当前实际内存块大小
                        blockArray[0:4]←blockSize          //更新块的头部 4 字节数据,为当前实际大小
                        flush                              //写入文件,刷新到磁盘
                        Call createIndex(⋅)                //调用算法 2,创建索引结构
                        return
                      end if
                      blockArray.append(logSize)
   81   82   83   84   85   86   87   88   89   90   91