量化数据刚开始积累时,一个 `daily.parquet` 往往就够用。等年份、品种和字段越来越多,每次为了回测一个月的数据仍然把整张表读进内存,速度和内存占用都会变得不太合理。这时可以把单文件改成分区数据集,但目录怎么设计比“换成 Parquet”更关键。
我比较习惯按低基数字段分区,例如:
```text
quotes/
year=2026/month=10/part-0.parquet
```
这种 `字段=值` 的路径符合 Hive 风格。PyArrow 的 `HivePartitioning` 会从目录解析分区键,字段顺序可以忽略;读取时再配合过滤条件,扫描器有机会跳过无关分区。用 pandas 读取时可以写成:
```python
df = pd.read_parquet(
"quotes",
engine="pyarrow",
filters=[("year", "==", 2026), ("month", "==", 10)],
columns=["trade_date", "symbol", "close", "volume"]
)
```
这里有两个容易踩的坑。第一,分区列的类型要固定。目录里的 `2026` 如果被推断为字符串,而代码拿整数过滤,结果可能不符合预期。正式任务里最好显式定义分区 schema,并在写入前校验日期、代码和价格字段的类型。第二,不要直接按股票代码建立几十万个小目录。分区过细会产生大量小文件,目录枚举和元数据开销反而可能超过读取数据本身。
我的做法是:日期按年、月分区,股票代码留在文件内部;每批写入后检查重复键 `(trade_date, symbol)`,并记录本批次行数、最小日期和最大日期。回测读取时既传 `filters`,也只选择真正使用的列。前者减少需要扫描的分区,后者减少列读取和 DataFrame 占用。
分区不是为了让目录看起来整齐,而是让常用查询尽量少碰无关数据。设计前先列出最常见的读取条件,再决定目录层级,通常比照搬一套“标准结构”更有效。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。