稀疏数组是面向高稀疏度静态网格的无损存储结构,仅存非零三元组,要求稀疏因子≤5%、无效值统一、数据静态、维度固定;采用二进制COO格式序列化,通过紧凑类型、varint编码等极致控件实现高压缩。

识别真正适合稀疏数组的网格数据
不是所有“大”网格都适合。必须满足:
• 稀疏因子 ≤ 0.05(即非零元素占比 ≤ 5%),越低越好;
• 无效值高度统一(如全部为0、-1、NULL或某固定哨兵值);
• 数据静态不变或极低频更新(因稀疏结构不支持高效随机写);
• 网格维度已知且固定(如 10⁵×10⁵ 的地理高程栅格,99.98%为海平面值0)。
采用三元组(COO)格式构建稀疏数组并序列化到磁盘
这是无损压缩的核心操作:
• 第一行写入三个整数:m(总行数)、n(总列数)、t(非零元个数);
• 后续 t 行,每行写入一个三元组:i(行下标)、j(列下标)、value(实际值);
• 所有数值统一用紧凑类型存储(如 int32 或更小的 uint16,视值域而定);
• 直接以二进制方式顺序写入文件(避免文本解析开销与空格/换行冗余),文件头可加 4 字节 magic number 标识格式版本。
磁盘I/O优化与空间极致控制
要压到“高压缩”,需控制每个字节:
• 不存原始二维数组的任何零值 —— 零值完全由逻辑隐含(未出现在三元组中即为默认值);
• 若行列索引范围可控(如最大 10⁶),可用 varint 编码代替固定长度整数;
• 若 value 类型单一且取值有限(如仅 0/1/2),可将 value 与索引合并编码(如用 2 位存 value,30 位存 i×n+j);
• 文件末尾不补零、不加校验块(若业务允许,校验可由上层FS或传输协议保障)。
还原时严格保证无损性
解压即重建原始语义:
• 读取首行得 m, n, t;分配 m×n 全默认值(如全0)内存块或 mmap 映射;
• 顺序读取 t 个三元组,直接赋值到对应 [i][j] 位置;
• 不做排序、不插值、不四舍五入 —— 每个非零值的位置与大小与原始完全一致;
• 还原后 memcmp 原始内存快照与重建快照,结果为 0 即证明无损。

















