数据缓存系统

📎 引用文件

本文引用的文件 - agent/backtest/loaders/base.py - agent/src/config/env_schema.py - agent/src/config/accessor.py - agent/src/config/paths.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论
  10. 附录

简介

本文件为 Vibe-Trading 数据缓存系统的权威文档,聚焦于“基于内容寻址的缓存键生成”、“Parquet 文件格式存储与 DuckDB 集成”、“缓存启用配置、存储路径管理与版本兼容性处理”、“缓存读取/写入流程、元数据管理与索引类型恢复机制”、“性能优化策略、清理策略与监控指标”,以及“调试工具使用与故障排除”。该缓存是可选的本地磁盘缓存,用于在回测/数据加载阶段避免重复拉取已结算的数据范围。

项目结构

与数据缓存直接相关的代码集中在以下模块: - 缓存实现与读写逻辑:agent/backtest/loaders/base.py - 环境变量与配置模型:agent/src/config/env_schema.py - 配置访问器(线程安全单例):agent/src/config/accessor.py - 运行时根路径与默认目录约定:agent/src/config/paths.py

graph TB A["应用/加载器调用"] --> B["base.py<br/>缓存接口: get/put/cached_loader_fetch"] B --> C["env_schema.py<br/>DataConfig<br/>VIBE_TRADING_DATA_CACHE / ROOT"] B --> D["accessor.py<br/>get_env_config() 单例"] B --> E["DuckDB<br/>read_parquet / COPY TO PARQUET"] B --> F["文件系统<br/>~/.vibe-trading/cache/loaders/<source>/<key>.parquet + .json"]

图表来源 - agent/backtest/loaders/base.py:243-398 - agent/src/config/env_schema.py:186-187 - agent/src/config/accessor.py:52-76 - agent/src/config/paths.py:13-34

章节来源 - agent/backtest/loaders/base.py:243-398 - agent/src/config/env_schema.py:186-187 - agent/src/config/accessor.py:52-76 - agent/src/config/paths.py:13-34

核心组件

章节来源 - agent/backtest/loaders/base.py:284-325 - agent/backtest/loaders/base.py:475-511 - agent/backtest/loaders/base.py:536-595 - agent/src/config/env_schema.py:186-187 - agent/src/config/accessor.py:52-76

架构总览

缓存系统围绕“按内容寻址的键 -> Parquet 文件 + 元数据 JSON”展开,读写均通过 DuckDB 完成,确保高性能列式存储与查询。

sequenceDiagram participant L as "加载器" participant C as "缓存层(base.py)" participant FS as "文件系统" participant DB as "DuckDB" L->>C : cached_loader_fetch(...) C->>C : loader_cache_enabled()? range_is_final? alt 命中条件 C->>FS : 计算 key -> 查找 <key>.parquet C->>FS : 读取 <key>.parquet.json 元数据 C->>DB : read_parquet(文件) DB-->>C : DataFrame C-->>L : 返回缓存数据 else 未命中或不可缓存 C-->>L : 调用 fetch() L-->>C : 返回 DataFrame C->>FS : 写入临时 Parquet + 元数据 C->>DB : COPY frame TO parquet C->>FS : os.replace 原子替换 C-->>L : 返回原始数据 end

图表来源 - agent/backtest/loaders/base.py:343-439 - agent/backtest/loaders/base.py:475-511 - agent/backtest/loaders/base.py:536-595

详细组件分析

内容寻址键生成算法

flowchart TD Start(["开始"]) --> BuildPayload["构建负载字典<br/>version/source/symbol/timeframe/start_date/end_date/fields"] BuildPayload --> NormalizeDates["日期标准化为 YYYY-MM-DD"] NormalizeDates --> SortKeys["JSON 排序键并紧凑编码"] SortKeys --> Hash["SHA-256 哈希"] Hash --> Key["输出十六进制键"] Key --> End(["结束"])

图表来源 - agent/backtest/loaders/base.py:284-303 - agent/backtest/loaders/base.py:442-463

章节来源 - agent/backtest/loaders/base.py:284-303 - agent/backtest/loaders/base.py:442-463

Parquet 存储与 DuckDB 集成

flowchart TD WStart(["写入开始"]) --> Prepare["准备帧与元数据<br/>记录索引列/名称/dtypes"] Prepare --> WriteTmp["DuckDB 写入临时 Parquet"] WriteTmp --> MetaTmp["写入临时元数据 JSON"] MetaTmp --> AtomicSwap{"os.replace 原子替换"} AtomicSwap --> |成功| WEnd(["写入完成"]) AtomicTmp["失败清理临时文件"] --> WEnd

图表来源 - agent/backtest/loaders/base.py:536-595

章节来源 - agent/backtest/loaders/base.py:475-511 - agent/backtest/loaders/base.py:536-595

缓存启用配置与存储路径管理

flowchart TD Cfg["读取配置"] --> Enabled{"VIBE_TRADING_DATA_CACHE 为真?"} Enabled --> |否| Off["禁用缓存"] Enabled --> |是| Root{"VIBE_TRADING_DATA_CACHE_ROOT 有效?"} Root --> |是| Custom["使用自定义根目录"] Root --> |否| Default["默认根: ~/.vibe-trading/cache/loaders"] Custom --> Path["按 source 分段 + 键.parquet"] Default --> Path

图表来源 - agent/backtest/loaders/base.py:251-281 - agent/src/config/env_schema.py:186-187 - agent/src/config/paths.py:13-34

章节来源 - agent/backtest/loaders/base.py:251-281 - agent/src/config/env_schema.py:186-187 - agent/src/config/paths.py:13-34

版本兼容性与清理策略

章节来源 - agent/backtest/loaders/base.py:243-248 - agent/backtest/loaders/base.py:442-459

缓存读取/写入流程与元数据管理

sequenceDiagram participant App as "调用方" participant Cache as "缓存层" participant FS as "文件系统" participant DB as "DuckDB" App->>Cache : loader_cache_get(...) Cache->>FS : 检查 <key>.parquet 是否存在 alt 存在 Cache->>FS : 读取 <key>.parquet.json Cache->>DB : read_parquet(文件) DB-->>Cache : DataFrame Cache->>Cache : 重建索引/列名/dtype Cache-->>App : 返回 DataFrame else 不存在 Cache-->>App : None end

图表来源 - agent/backtest/loaders/base.py:343-368 - agent/backtest/loaders/base.py:475-511

章节来源 - agent/backtest/loaders/base.py:343-368 - agent/backtest/loaders/base.py:475-511 - agent/backtest/loaders/base.py:536-595

索引类型恢复机制

章节来源 - agent/backtest/loaders/base.py:514-533 - agent/backtest/loaders/base.py:574-595

依赖关系分析

graph LR Base["base.py 缓存实现"] --> EnvSchema["env_schema.py 配置模型"] Base --> Accessor["accessor.py 配置访问器"] Base --> Paths["paths.py 路径工具"] Base --> DuckDB["DuckDB 引擎"] Base --> FS["文件系统"]

图表来源 - agent/backtest/loaders/base.py:243-398 - agent/src/config/env_schema.py:186-187 - agent/src/config/accessor.py:52-76 - agent/src/config/paths.py:13-34

章节来源 - agent/backtest/loaders/base.py:243-398 - agent/src/config/env_schema.py:186-187 - agent/src/config/accessor.py:52-76 - agent/src/config/paths.py:13-34

性能考虑

[本节为通用指导,不直接分析具体文件]

故障排除指南

章节来源 - agent/backtest/loaders/base.py:328-340 - agent/backtest/loaders/base.py:475-511 - agent/backtest/loaders/base.py:536-595

结论

Vibe-Trading 的数据缓存系统以内容寻址为核心,结合 Parquet 与 DuckDB 实现了高效、可靠、可恢复的本地缓存。通过环境变量灵活控制启用与路径,借助元数据与版本字段保障一致性与兼容性。建议在生产环境中配合定期清理与监控,以获得最佳性能与稳定性。

[本节为总结,不直接分析具体文件]

附录

环境变量清单

章节来源 - agent/src/config/env_schema.py:186-187

默认存储路径

章节来源 - agent/backtest/loaders/base.py:264-281 - agent/backtest/loaders/base.py:306-325

关键函数参考

章节来源 - agent/backtest/loaders/base.py:284-325 - agent/backtest/loaders/base.py:343-439 - agent/backtest/loaders/base.py:475-595