时间序列数据按年分区存 Parquet
2026-08-12
几千万行的分钟级时间序列,一开始放 SQLite,单表越来越大之后追加一天的数据要等好几秒,整表 VACUUM 更是要命。换成按年分区的 Parquet 后,同样的数据体积只有原来的八分之一,追加只改当年那一个文件。
目录结构
db/
└── <symbol>/
└── 1min/
├── 2024.parquet
├── 2025.parquet
└── 2026.parquet
写入时的两个原则
- 原子写:先写
.tmp,再os.replace。进程在写一半时被杀,留下的是旧文件而不是半截文件。 - 按业务日期分区而不是时间戳:跨午夜的数据归属哪一天是业务规则定的,分区键用算好的业务日期列,别在读的时候从时间戳现推。
读取
pandas.read_parquet 配合 columns= 只取要用的列,加上 pyarrow 的谓词下推按日期过滤,常见的"取某个月"查询在几十毫秒内返回。
什么时候别这么做
需要频繁单行更新、或者多进程并发写同一分区的场景,Parquet 不合适——它是追加友好、更新不友好的格式。那种需求还是交给数据库。