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)