使用场景
搜索大文件时,假如行文件都有一个唯一的id(我们称之为logid), 那么我们完全刻意根据logid索引logid所在的文件中的offset,对于lzo压缩的文件而言,则能很容易滴索引到logid所在的数据块(单块不超过256k), 这样便能再一个任意大的文件中以极快的速度获取到logid对应的数据块
技术栈
- lzo是无损压缩算法
- lzo文件分为3个部分
header | blocks | tail |
---|---|---|
第一个块 | 每个block最大256k, 但行记录超出部分会被切割为多个block | 最后4个byte |
解析*.lzo.index(索引文件)文件
查看indexer源码发现
struct.pack(">Q", block_offset)
即将offset 转为8字节的二进制代码
解析方式为
struct.unpack(“>Q”, f.read(8))
获取offsets
offsets = []
while True:
offset = indexFileStream.read(8)
if not offset:
break
data = struct.unpack(">Q", offset)
offsets.append(data[0])
lzoFileStream.seek(offsets[-1])
lastBlock = lzoFileStream.read()
offsets.append(offsets[-1]+len(lastBlock)-4)#tail
header & tail
lzoFileStream.seek(0)
header = lzoFileStream.read(offsets[0])
lzoFileStream.seek(offsets[-1])
tail = lzoFileStream.read(4)
获取完整block内容
lzoFileStream.seek(offsets[1])
block = lzoFileStream.read(offsets[2])
#content 为一段独立的可解压的数据块(不一定是完整的一行)
content = header + block + tail