如何在小内存环境中实现全市场数据的aj
本页介绍在小内存环境下对全市场股票数据进行 aj 关联的总体思路,并给出示例代码实现。
Source: https://dolphindb.cn/blogs/129
What this page covers
- 小内存环境下进行全市场数据 aj 关联的方法与代码示例。
- 实测结果规模与社区版内存限制相关背景。
- 降低内存占用与结果持久化的优化方向。
- 页面顶部的培训营活动报名引导信息。
- 作者署名与发布时间信息。
技能认证特训营第二期正式开启(限时报名)
页面顶部提供培训营活动报名引导,并提示优惠相关信息。
- 提供“技能认证特训营第二期”的报名链接。
- 文案包含“正式开启”的状态描述。
- 文案包含“限时报名”的提示。
- 文案提到“专属福利优惠”。
如何在小内存环境中实现全市场数据的aj
该部分说明小内存场景下进行全市场股票数据 aj 关联的思路,并通过示例函数展示实现方式。
- 总体思路是“拿时间换空间”。
- 实现倾向于尽可能串行执行。
- 强调及时释放中间变量以控制内存占用。
- 实现方式包含“按股票进行 aj + each”。
- 示例函数 ajBySecurityID 的输入参数包含 securityIDStr 与 aDate。
- ajBySecurityID 从 dfs://SH_TSDB_tick 的 tick 表读取数据。
- ajBySecurityID 从 dfs://SH_TSDB_snapshot_ArrayVector1 的 snapshot 表读取数据。
- tick 的过滤条件包含 date(Tradetime)=aDate 与 securityID=securityIDStr。
- snapshot 的过滤条件包含 date(DateTime)=aDate 与 securityID=securityIDStr。
- aj 关联键使用 `SecurityID`TradeTime 与 `SecurityID`DateTime。
- allSecurityID 通过从 tick 表取 distinct securityID 生成(按 date(TradeTime)=2021.01.04)。
- 给出 each 调用方式:each(ajBySecurityID, allSecurityID, 2021.01.04)。
- 提到 loadTable 的行为:仅加载元数据。
- 提供 ajBySecurityID2 方案:在 dfs tables 上 aj 并在 where 中过滤。
作者与日期
该部分提供文章作者署名与发布日期信息。
- 作者署名为“笨笨”。
- 发布日期为 2024-12-13。
实测结果与社区版内存限制背景
该部分给出全市场 aj 结果集体量的实测数据,并说明社区版在内存中获取全量结果集存在困难。
- 在 2021.01.04 的实测中,结果涉及约 1800 只股票。
- 在 2021.01.04 的实测中,结果集大小约 25GB。
- 社区版无法在内存中获得所有结果集。
- 要拿到所有结果集需要进行优化。
后续优化点
该部分列出降低内存占用与将结果进行持久化存储的优化方向。
- 只读取所需字段,而不是使用 select *。
- 将结果数据存回 dfs 表,而不是放在内存中。
- 可将 return data 的部分调整为写入 dfs 表。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 文章 | 发布日期 | 2024-12-13 | high |
| 文章 | 作者署名 | 笨笨 | high |
| 小内存环境实现全市场数据 aj 的总体思路 | 方法原则 | 拿时间换空间,尽可能串行,及时释放中间变量 | medium |
| 实现方式 | 按股票处理策略 | 按股票进行 aj + each | high |
| 函数 ajBySecurityID | 输入参数 | securityIDStr, aDate | high |
| ajBySecurityID 读取数据源 | tick 表位置与名称 | dfs://SH_TSDB_tick, 表名 tick | high |
| ajBySecurityID 读取数据源 | snapshot 表位置与名称 | dfs://SH_TSDB_snapshot_ArrayVector1, 表名 snapshot | high |
| ajBySecurityID 数据过滤条件(tick) | where 条件 | date(Tradetime) = aDate 且 securityID = securityIDStr | high |
| ajBySecurityID 数据过滤条件(snapshot) | where 条件 | date(DateTime) = aDate 且 securityID = securityIDStr | high |
| ajBySecurityID aj 关联键 | aj 参数(键列) | `SecurityID`TradeTime 与 `SecurityID`DateTime | high |
| allSecurityID 生成方式 | 取数逻辑 | 从 dfs://SH_TSDB_tick 的 tick 表中按 date(TradeTime)=2021.01.04 取 distinct securityID | high |
| 函数 ajBySecurityID2 | 输入参数 | securityIDStr, aDate | high |
| loadTable | 行为描述 | loadTable ONLY load metadata | medium |
| ajBySecurityID2 aj 关联方式 | 在 dfs tables 上进行 aj 并筛选 | select * from aj(tick, snapshot, `SecurityID`TradeTime`TradeTime, `SecurityID`DateTime`DateTime) 并在 where 中按日期与两表 SecurityID 过滤 | high |
| 执行方式 | each 调用 | rst = each(ajBySecurityID, allSecurityID, 2021.01.04)(另提供注释掉的 ajBySecurityID2 版本) | high |
| 2021.01.04 全市场 aj 结果集 | 股票数量 | 1800 只股票 | medium |
| 2021.01.04 全市场 aj 结果集 | 结果集大小 | 25GB 左右 | medium |
| 社区版 | 内存中获取全量结果集的可行性 | 无法在内存中获得所有结果集;要拿到所有结果集需要优化 | medium |
| 优化点 | 字段读取策略 | 只读取所需字段,而不是 select * | high |
| 优化点 | 结果集存储策略 | 将结果数据存回 dfs 表而不是放在内存中(将 return data 部分改为写入 dfs 表) | high |
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |
| 技能认证特训营第二期 | 活动状态与优惠描述 | 正式开启;限时报名;享专属福利优惠 | low |