2026-08-31 00:34:59 +08:00
|
|
|
|
# Agent Note: JSONL 持久化压缩延迟
|
2026-08-26 16:01:07 +08:00
|
|
|
|
|
|
|
|
|
|
Status: implemented
|
|
|
|
|
|
|
|
|
|
|
|
[English](2026-08-25-persistence-latency-and-page-size.md) | 中文
|
|
|
|
|
|
|
|
|
|
|
|
## 问题
|
|
|
|
|
|
|
2026-08-31 00:34:59 +08:00
|
|
|
|
物理持久化优化需要减少保留存储,同时不能把不成比例的工作转移到完整写入、读取或 Session fork。原有的 105-Session 语料显示,JSONL level-19 压缩会让完整写入与 fork 耗时增加一倍以上。
|
2026-08-26 16:01:07 +08:00
|
|
|
|
|
|
|
|
|
|
该决策需要来自更多样会话的证据,包括长事件流与原语料之外的 payload。扩展后的语料包含 501 个真实会话、16,153,332 个逻辑事件与 2,002,145,570 字节序列化事件数据。
|
|
|
|
|
|
|
|
|
|
|
|
## 决策
|
|
|
|
|
|
|
|
|
|
|
|
### 存储编码保持为物理层行为并可独立解码
|
|
|
|
|
|
|
2026-08-31 00:34:59 +08:00
|
|
|
|
JSONL 把严格递增的 `sourceEventSeqs` 存为标量值与闭区间的混合数组,其他顺序保持原样。读取时会在暴露事件前还原原始 `number[]`。
|
2026-08-26 16:01:07 +08:00
|
|
|
|
|
|
|
|
|
|
### JSONL 使用 Zstandard 标准级别
|
|
|
|
|
|
|
|
|
|
|
|
JSONL 写入方继续为每个持久 append 批次写入一个带 checksum 的 Zstandard frame,但使用压缩器的标准级别。无损 `sourceEventSeqs` 区间编码继续生效。各 frame 仍可独立解码,以支持后缀读取与撕裂尾部恢复;只移除昂贵的 level-19 搜索。
|
|
|
|
|
|
|
|
|
|
|
|
### 扩展基准
|
|
|
|
|
|
|
|
|
|
|
|
每个候选方案都从同一份 501 会话语料独立重建五次,每个 append 批次包含 512 个事件。各轮轮换执行顺序,使每个候选方案在每个运行位置各出现一次。每次重建执行三轮完整读取与后缀读取。下表中的每项指标都去掉最高与最低的一次重建,再平均其余三次。完整读取与后缀读取耗时覆盖对全部会话的一轮扫描,fork 耗时覆盖全部 501 个会话。
|
|
|
|
|
|
|
|
|
|
|
|
| 后端 | 存储大小 | 完整写入 | 完整读取 | 后缀读取 | Fork |
|
|
|
|
|
|
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
|
|
|
|
| JSONL `master` | 172.43 MB | 200.902 s | 8.033 s | 24.479 s | 72.670 s |
|
|
|
|
|
|
| JSONL + 来源区间 | 148.15 MB (-14.1%) | 197.281 s (-1.8%) | 7.799 s (-2.9%) | 24.582 s (+0.4%) | 72.308 s (-0.5%) |
|
|
|
|
|
|
| JSONL + 来源区间 + level 19 | 130.22 MB (-24.5%) | 329.442 s (+64.0%) | 7.764 s (-3.3%) | 24.454 s (-0.1%) | 166.177 s (+128.7%) |
|
|
|
|
|
|
|
|
|
|
|
|
相对使用来源区间的标准级别 frame,level 19 可再减少 12.1% 的 JSONL 字节,但会让完整写入增加 67.0%、fork 增加 129.8%;完整读取与后缀读取分别变化 -0.4% 与 -0.5%。因此,更深入的搜索只改善保留体积,无法通过延迟敏感操作的收益抵消反复付出的编码成本。
|
|
|
|
|
|
|
|
|
|
|
|
## 考虑过的替代方案
|
|
|
|
|
|
|
|
|
|
|
|
**保留 JSONL level 19。** 不予采用。在扩展语料上,它相对默认级别 frame 可再减少 12.1%,却让完整写入增加 67.0%、fork 增加 129.8%,而完整读取与后缀读取的差异都不足 1%。默认级别 frame 配合来源区间后,相对 master 仍能缩小 14.1%,且没有实质性延迟退化。
|
|
|
|
|
|
|
|
|
|
|
|
**把整份 JSONL 日志压成单个 frame。** 不予采用。该方案可改善跨批次压缩,但后缀读取必须从头解压,也会失去按批次恢复撕裂尾部的能力。
|
|
|
|
|
|
|
|
|
|
|
|
**对事件内容去重。** 不予采用。消息复述与工具参数只能在依赖重建假设时删除,而 compaction、重试和修剪可能让这些假设失效。物理压缩保留每个事件,不增加重建语义。
|
|
|
|
|
|
|
|
|
|
|
|
## 后果
|
|
|
|
|
|
|
2026-08-31 00:34:59 +08:00
|
|
|
|
JSONL 保留低成本来源优化,同时避开 level-19 的写入与 fork 代价。扩展语料显示,来源区间让保留体积缩小 14.1%,且没有实质性延迟退化。
|
2026-08-26 16:01:07 +08:00
|
|
|
|
|
|
|
|
|
|
## 相关资料
|
|
|
|
|
|
|
2026-08-31 00:34:59 +08:00
|
|
|
|
- [JSONL-only first-party Session persistence](../simplification/2026-08-30-jsonl-only-session-persistence.zh.md)——负责删除另一种权威 backend;[已归档 SQLite 压缩记录](../../archived/architecture/2026-08-18-sqlite-physical-chunk-row-compression.md)保留其历史测量。
|
2026-08-26 16:01:07 +08:00
|
|
|
|
- [zstandard-jsonl-session-logs](2026-07-19-zstandard-jsonl-session-logs.zh.md) — 定义带 checksum 的按批次 frame 容器,以及本笔记恢复的标准压缩级别策略。
|