free-stockdb存储引擎揭秘LevelDB时序设计如何让分钟K查询飞快【免费下载链接】free-stockdb面向 A 股日K、分钟K与ETF分钟数据的本地量化引擎集成增量同步、本地缓存、复权、批量查询、回测与指标计算。项目地址: https://gitcode.com/GitHub_Trending/fr/free-stockdb free-stockdb 是一个面向 A 股日K、分钟K与 ETF 数据的本地量化数据引擎。它的查询之所以快秘密藏在底层——LevelDB 时序键值设计把每一根分钟K线变成一条紧凑记录用代码时间天然有序的 Key 直接定位再配合布隆过滤器与 LRU 缓存让全市场分钟K批量查询不再等待。本文带你拆解这套存储设计。为什么选 LevelDB而不是 MySQL分钟K线数据有两个鲜明特征写入量大、按时间范围批量读取。MySQL 这类关系型数据库的索引、事务、多表查询能力在这里大多用不上反而带来额外开销。free-stockdb 直接采用嵌入式键值存储 LevelDB理由很务实顺序扫描极快K线按时间有序存放查一段区间就是顺着磁盘读几乎零随机 IO单文件落盘数据全部在./data目录同步器可以整包传输、断点续传零部署不需要独立的数据库服务进程stockdb.exe双击即用存储引擎的完整实现见 cpp/src/server.cpp配置参数集中在 stockdb.conf 的leveldb段。秘密一32 字节的紧凑 K 线记录传统方案里一行K线往往是带字段名的结构化记录而 free-stockdb 定义了定长的KRecord结构uint32_t datetimeYYYYMMDD或YYYYMMDDHHMM格式时间戳4 字节open / high / low / close4 个floatvolume / amount成交量、成交额两个double结构体按 8 字节对齐后正好32 字节/根K线注释里还标注了内存映射零拷贝优化。10 年 5 分钟线的 50 多万根记录全部塞进一个值里一次读取即可拿到整段数据避免海量小键值查询的开销。结构定义见 cpp/include/stockdb/client.hpp。秘密二代码时间的有序 Key 设计LevelDB 的本质是Key 按字典序排序的有序键值表free-stockdb 把这一点用到了极致。核心查询路径采用三类前缀 Key源码注释原文日k:600519:* → 某只股票的全部日K 复权:* → 复权因子 板块:* → 板块映射妙处在于时间戳本身就是定长数字字符串202401011030 202401011035 202401020931字典序恰好等于时间先后顺序。于是查某股全历史Seek(日k:600519:)前缀扫描一路读到前缀结束即停查某段时间Seek(日k:600519:20240101)到日k:600519:20240201~一次范围扫描scan_range精确定位起止边界这就是zb.get()批量指标计算快数倍的关键——指标计算前先把区间数据一段连续读出而不是逐条查询。相关实现见 scan_prefix / scan_range。秘密三布隆过滤器 500MB LRU 缓存精确点查比如rd.get()拿单条数据时LevelDB 可能翻遍所有磁盘块。free-stockdb 在引擎初始化时叠加了两道加速器cpp/src/server.cpp组件配置作用布隆过滤器NewBloomFilterPolicy(10)判断 Key 是否存在大概率免读磁盘LRU 块缓存默认 500MB热数据近期行情常驻内存Snappy 压缩开启磁盘占用更小CPU 解压极快配合 stockdb.conf 中cache_size: 500、write_buffer_size: 16、block_size: 32的默认调优常用股票、常用区间的查询基本都命中内存缓存。增量同步如何与 LevelDB 无缝配合数据不是每次全量下载。同步器stockdb_updater通过镜像的manifest.txt清单做增量同步每行记录文件的 SHA-256、字节数与相对路径下载先进*.part临时文件校验一致后才替换已存在且校验通过的文件直接跳过。由于底层数据文件本身就是 LevelDB 的.ldb/CURRENT/MANIFEST-*文件同步 直接搬运数据库快照不需要导入导出转换。传输侧再叠加 Zstd 压缩历史数据体积比 CSV/MySQL 方案小 3 倍以上。完整镜像协议说明见 docs/DATA_SOURCE.md。一分钟上手体验双击【数据更新.exe】同步数据到./data双击【stockdb.exe】启动本地服务默认127.0.0.1:7899打开 数据网页版.html 或直接看 调用方式/调用说明.txt用 Python、HTTP、Excel、MCP 任意方式查询小结free-stockdb 的查询速度并非来自复杂算法而是三件简单的事做对了✅定长紧凑记录32 字节/根K线一次读一整段✅Key 即索引频率:代码:时间戳的字典序 时间序前缀扫描代替索引查询✅缓存与过滤器兜底布隆过滤器 LRU 缓存让点查近乎全内存命中这套时序键值设计对任何需要处理高频时间序列的本地项目都值得借鉴——数据在本地速度才有保证。【免费下载链接】free-stockdb面向 A 股日K、分钟K与ETF分钟数据的本地量化引擎集成增量同步、本地缓存、复权、批量查询、回测与指标计算。项目地址: https://gitcode.com/GitHub_Trending/fr/free-stockdb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考