如何在单个文件中存储多个可能包含换行符的随机blob?
随机二进制Blob单文件存储解决方案
核心前提说明
由于你生成的是完全随机的无符号字符,0-255区间的所有值都可能出现,不存在“绝对不会出现在Blob中的分隔字符”,因此直接替换分隔符的方案不可行。
最优方案(单文件无额外依赖,优先选择)
方案1:转义编码方案
该方案通过转义规则彻底区分Blob内容中的换行和Blob分隔符,不需要额外文件:
- 写入规则:
- 选定
\(ASCII 0x5C)作为转义字符 - 遍历Blob的每个字节:
- 遇到字节
0x5C时,写入\\两个字节 - 遇到字节
0x0A(换行符)时,写入\n两个字节 - 其余字节直接写入
- 遇到字节
- 单个Blob处理完成后,单独写入一个
0x0A作为当前Blob的结束分隔符
- 选定
- 读取规则:
- 逐字节扫描文件内容:
- 遇到
0x5C时,读取下一个字节:若为0x5C还原为0x5C,若为0x6E还原为0x0A - 遇到未被转义的单独
0x0A时,判定为当前Blob读取结束,开始处理下一个Blob
- 遇到
- 逐字节扫描文件内容:
- 优势:存储开销极低,随机Blob场景下平均额外存储开销仅为0.78%,完全单文件无依赖,符合你按行对应Blob的使用习惯。
方案2:固定长度前缀方案
该方案不需要转义处理,读写速度更快,适合对性能要求高的场景:
- 写入规则:
- 每个Blob写入前,先写入1个固定4字节的
uint32_t类型值,值为当前Blob的字节长度,提前约定好统一使用大端序或小端序避免跨平台解析问题 - 直接写入完整的Blob内容,不需要添加任何分隔符
- 每个Blob写入前,先写入1个固定4字节的
- 读取规则:
- 每次先读取4字节解析为长度N
- 再连续读取N个字节即为一个完整的Blob,循环直至文件读取完毕
- 优势:无转义逻辑,读写性能拉满,同样是单文件无额外依赖,每个Blob仅固定增加4字节开销。
偏移文件方案的适用场景
只有当你需要随机读取指定序号的Blob时,单独的偏移文件才有价值:提前把所有Blob的起始偏移量存在偏移文件中,读取指定Blob时不需要遍历前面的内容,直接寻址即可。如果只是顺序读写所有Blob,偏移文件方案完全没有优势,还会额外增加一次IO访问。
内容的提问来源于stack exchange,提问作者Romy
相关产品推荐
相关产品推荐

