多品种金融数据高效导入丨DolphinDB 希施玛历史数据自动化导入模块介绍
该页面介绍 DolphinDB 的 CsmarData 模块,用于将希施玛历史数据按结构化流水线高效导入,并说明本文覆盖范围。
Source: https://dolphindb.cn/blogs/174
What this page covers
- 模块定位与导入挑战背景。
- 历史数据目录结构要求与市场代码对照。
- 支持的数据源与覆盖市场范围(含表格/图片呈现)。
- schema(csvSchema/dfsSchema)用途与目录结构。
- 建库建表模块与分区/排序方案。
- 导入模块函数、参数与任务查询方法。
- 性能测试环境、结果与吞吐量优化建议。
技能认证特训营第二期报名入口与优惠提示
页面顶部提供活动报名入口,并提示福利优惠信息。
- 提供“技能认证特训营第二期”的报名链接。
- 报名入口与优惠提示位于页面顶部区域。
文章标题、作者与发布日期
页面包含文章标题、作者署名与发布日期信息。
- 文章标题为“多品种金融数据高效导入丨DolphinDB 希施玛历史数据自动化导入模块介绍”。
- 作者署名为 momo。
- 发布日期为 2025-04-03。
引言:希施玛历史数据导入挑战与 CsmarData 模块定位
说明希施玛历史数据的结构与高频特征对入库提出需求,并介绍 DolphinDB 的 CsmarData 模块及本文范围。
- DolphinDB 提供 CsmarData 模块作为高效数据导入解决方案。
- 模块通过结构化数据处理流水线实现多品种金融数据的高效导入。
- 模块采用模块化设计以存储复杂金融数据。
- 覆盖股票与期货期权的多类数据源(示例:Level-2、逐笔、分笔等)。
历史数据文件结构要求与市场代码表
给出希施玛原始文件目录结构要求、注意事项,并提供市场名称与代码对照表。
- 用户需自行解压希施玛数据。
- 主目录下包含以日期命名的日期目录。
- 每个日期目录下包含各市场各数据源当日的 CSV 文件。
- 导入代码依赖该目录结构,解压后需保持一致。
- 提供市场代码对照(示例:SSE、SZSE、SHFE、INE、DCE、GFEX、CFFEX、CZCE)。
模块介绍:组成部分与支持的数据源/市场
概述 CsmarData 模块的三大部分,并说明股票与期货期权的数据源与覆盖市场信息(部分以图片表格呈现)。
- 模块主要包含:数据表结构、数据库和分区表创建、数据导入。
- 股票核心数据源包括:Level-2快照行情、逐笔委托、逐笔成交。
- 期货期权核心数据源包括:分笔数据、套利深度、分价成交量、委托统计、委托队列、静态数据。
- 股票相关数据源覆盖市场为上交所与深交所。
- 期货期权数据支持范围以图片表格形式给出(表 2-2)。
数据表结构:csvSchema 与 dfsSchema
说明 _tbSchema_ 目录下 schema 相关内容的用途与分层结构(stock/futures)。
- _tbSchema_ 包含 csvSchema 与 dfsSchema 子文件夹。
- csvSchema 用于指定 DolphinDB 读取 CSV 文件时的数据格式。
- dfsSchema 用于指定数据写入数据库时的数据格式。
- schema 子目录结构按 stock 与 futures 分类。
数据库与分区表创建:CreateDB.dos / CreateTB.dos 与分区方案
说明创建数据库/分布式表的模块文件,并给出股票与期货期权各数据源的分区与排序方案。
- 创建模块包含 _CreateDB.dos_ 与 _CreateTB.dos_。
- _CreateDB.dos_ 用于创建存储希施玛数据的数据库。
- _CreateTB.dos_ 用于创建存储希施玛数据的分布式表。
- 股票支持沪深分开或合并存储的分区/排序方案。
- 期货期权不同数据源对应不同存储引擎与分区/排序方案。
去重方案:删除已导入日期数据与 isDuplicated 去重
描述导入前删除库内对应日期数据,并在导入当日数据前采用以内存去重的策略(部分以图片表格呈现)。
- 每次导入前删除库内已存在的对应日期数据以避免重复。
- 将当天市场数据读入内存后再执行去重处理。
- 使用 isDuplicated([...], LAST) 进行去重后再导入数据库。
- 该策略用于降低重复提交任务或重复导入的影响。
数据导入:模块文件、主要函数与参数说明
介绍导入模块组成,并说明主要函数的语法、参数约束与功能描述。
- 数据导入模块包含 _loadOneDayData_ 文件夹与 _LoadCsmarData.dos_。
- _loadOneDayData_ 下分为 stock 与 futures 子目录。
- _LoadCsmarData.dos_ 用于导入指定目录下的所有希施玛数据并整合前置模块。
- autoLoadCsmarStockData 用于导入股票 Snapshot/Entrust/Trade 数据源。
- autoLoadCsmarFuturesData 支持 TAQ、Arbi、MarchpriceQty、OrderStatistic、OrderQueue、BasicInfo。
- getJobStatus 用于查询后台任务状态。
- getJobDetails 用于输出后台任务的中间信息。
使用示例:准备数据、上传模块、导入股票与期货期权
分步骤展示目录结构示例、模块上传位置说明,并给出股票与期货期权数据导入脚本示例。
- 模块同步位置为 DolphinDB 的 sever/modules 目录(原文拼写)。
- 股票示例包含:加载模块、登录、设置 fileDir、导入 Snapshot/Entrust/Trade。
- 股票示例包含:使用 getJobStatus 查看导入任务状态。
- 期货期权示例包含:加载模块、登录、设置 fileDir、导入 TAQ/Arbi/MarchpriceQty/OrderStatistic/OrderQueue/BasicInfo。
- 期货期权示例包含:使用 getJobStatus 查看导入任务状态。
注意事项:fileDir 查找规则与数据源/市场字段填写
说明 fileDir 目录层级要求、日期筛选逻辑,以及 markets 参数与支持市场的填写要求示例。
- fileDir 下必须存在以 8 位日期命名的目录层级(如 20250221)。
- 模块会递归查找由 8 位数字组成的日期文件夹并按 startDate/endDate 筛选。
- 模块会在每个日期文件夹下递归查找 CSV 并获取绝对路径。
- 导入单日数据建议通过 startDate/endDate 控制日期,而非通过 fileDir 控制。
- 模块会按数据源名称与市场名称查找文件,名称需填写正确。
性能测试:模块定位、测试环境、性能结果与优化建议
给出性能测试动机与结论性描述、软硬件环境、导入性能结果,以及吞吐量提升建议。
- 模块称专为处理 Level-2 高频数据设计。
- 性能测试环境包含 CentOS Linux 7 (Core) 与内核 3.10.0-1160.el7.x86_64。
- 测试 CPU 为 Intel(R) Xeon(R) Gold 5220R CPU @ 2.20GHz。
- 测试内存为 356G。
- 建议通过 parallel 参数增加后台导入任务数以提升并行度。
- 建议使用读写性能更好的硬盘以缓解磁盘瓶颈。
- 建议数据分盘存储并从多个盘读取以提升吞吐量。
总结:CsmarData 的流水线与分布式存储整合与适用场景
总结模块在多市场、多数据源高频数据入库方面的方案特性,并呼应性能测试结论性表述。
- 模块面向多市场、多数据源的高频数据入库场景。
- 模块强调流水线处理与分布式存储整合。
- 总结部分与性能测试结果形成呼应性结论描述。
附录:模块代码下载、异常处理与存储模型设计(字段映射)
附录提供模块压缩包下载链接、常见异常输出信息表,并列出多类数据的字段信息与说明。
- 提供 CsmarData 模块代码下载链接。
- 导入过程中的问题会在日志中输出对应报错提示信息。
- 提供“创建数据库/建表/无日期目录/不支持数据源或市场/日期格式/列数不匹配”等异常输出示例。
- 包含 warning 与 error 两类输出示例与触发条件。
- 提供多类数据的字段映射与说明表(分段呈现)。
Facts index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |
| 多品种金融数据高效导入丨DolphinDB 希施玛历史数据自动化导入模块介绍 | 发布日期 | 2025-04-03 | high |
| 文章作者署名 | 作者 | momo | high |
| DolphinDB | 提供的解决方案/模块 | CsmarData 模块(高效数据导入解决方案) | high |
| CsmarData 模块 | 实现方式 | 通过结构化数据处理流水线实现多品种金融数据的高效导入;采用模块化设计,可存储复杂金融数据并支持量化投研基础数据 | medium |
| CsmarData 模块 | 覆盖的核心数据源(股票) | Level-2快照行情、逐笔委托、逐笔成交 | high |
| CsmarData 模块 | 覆盖的核心数据源(期货期权) | 分笔数据、套利深度行情、分价成交量行情、委托统计行情、委托队列、静态数据 | high |
| 希施玛数据导入前准备 | 目录结构要求 | 用户需自行解压希施玛数据;主目录下包含以日期命名的日期目录,每个日期目录下包含各市场所有数据源该日期的 csv 文件 | high |
| 希施玛原始文件目录结构 | 导入代码依赖性 | 导入数据代码根据所示目录结构开发,用户需确保解压后目录结构保持一致 | high |
| 市场代码对照 | 上交所代码 | SSE | high |
| 市场代码对照 | 深交所代码 | SZSE | high |
| 市场代码对照 | 上期所代码 | SHFE | high |
| 市场代码对照 | 上期能源代码 | INE | high |
| 市场代码对照 | 大商所代码 | DCE | high |
| 市场代码对照 | 广期所代码 | GFEX | high |
| 市场代码对照 | 中金所代码 | CFFEX | high |
| 市场代码对照 | 郑商所代码 | CZCE | high |
| CsmarData 模块 | 主要包含的部分 | 数据表结构;数据库和分区表创建;数据导入 | high |
| 股票数据支持范围 | Level-2快照行情覆盖市场 | 上交所、深交所 | high |
| 股票数据支持范围 | 逐笔委托覆盖市场 | 上交所、深交所 | high |
| 股票数据支持范围 | 逐笔成交覆盖市场 | 上交所、深交所 | high |
| 期货期权数据支持范围 | 支持数据源与市场信息 | 以图片表格形式给出(表 2-2) | medium |
| _tbSchema_ 文件夹 | 内容来源与用途 | 根据第二章合并规则整理的数据结构;包含 csvSchema 与 dfsSchema 子文件夹 | high |
| csvSchema | 用途 | 指定 DolphinDB 读取 csv 文件时的数据格式 | high |
| dfsSchema | 用途 | 指定数据存入数据库的数据格式 | high |
| schema 子目录结构 | 分类 | 每个子文件夹下分为 stock 和 futures 子目录 | high |
| 数据库和分区表创建模块 | 包含文件 | _CreateDB.dos_ 与 _CreateTB.dos_ | high |
| _CreateDB.dos_ | 用途 | 创建存储希施玛数据的数据库 | high |
| _CreateTB.dos_ | 用途 | 创建存储希施玛数据的分布式表;具体表结构可参看 6.3 章节 | high |
| 股票分区方案(沪深分开存储) | 存储引擎/分区/分区列/排序列 | TDSB;时间按天分区 + 证券代码 HASH 25 分区;TradingDate 和 Symbol;Symbol+ TradingTime | high |
| 股票分区方案(沪深合并存储) | 存储引擎/分区/分区列/排序列 | TDSB;时间按天分区 + 证券代码 HASH 50 分区;TradingDate 和 Symbol;Market+Symbol+ TradingTime | high |
| 期货期权-分笔数据分区方案 | 存储方案/存储引擎/分区方案/分区列/排序列 | 多市场、期货期权合并;TSDB;时间按天分区 + 证券代码 HASH 30;TradingDate 和 Symbol;Market+Symbol+ TradingTime | high |
| 期货-套利深度行情分区方案 | 存储方案/存储引擎/分区方案/分区列/排序列 | 多市场合并;TSDB;时间按天分区;TradingDate;Market+Symbol+ TradingTime | high |
| 期货期权-分价成交量行情分区方案 | 存储方案/存储引擎/分区方案/分区列/排序列 | 多市场、期货期权合并;TSDB;时间按天分区;TradingDate;Market+Symbol+ TradingTim | high |
| 期货期权-委托统计行情分区方案 | 存储方案/存储引擎/分区方案/分区列/排序列 | 多市场、期货期权合并;TSDB;时间按天分区;TradingDate;Market+Symbol+ TradingTim | high |
| 期货期权-委托队列分区方案 | 存储方案/存储引擎/分区方案/分区列/排序列 | 期货期权合并;TSDB;时间按天分区 + 证券代码 HASH 50;TradingDate 和 Symbol;Symbol+ TradingTime | high |
| 期货期权-静态数据分区方案 | 存储方案/存储引擎/分区方案/分区列/排序列 | 期货期权合并;OLAP;时间按年分区;TradingDate;/ | high |
| 去重方案 | 导入前处理 | 每次导入前删除库内已有的对应日期数据(避免重复提交任务或重复导入) | high |
| 去重方案 | 当天数据去重方法 | 将当天市场数据读入内存,使用 isDuplicated([...], LAST) 去重后再导入数据库 | high |
| 数据导入模块组成 | 包含文件/文件夹 | _loadOneDayData_ 文件夹与 _LoadCsmarData.dos_ | high |
| _loadOneDayData_ | 内容结构与用途 | 包含 stock 与 futures 子目录;分别存放导入一天的股票与期货期权数据脚本;股票含沪深快照/逐笔委托/逐笔成交;期货期权含分笔/套利深度/委托统计/分价成交量/委托队列/静态数据 | high |
| _LoadCsmarData.dos_ | 用途 | 导入指定目录下的所有希施玛数据;整合前面所有模块;应用层面用户只需了解该模块主要函数 | high |
| autoLoadCsmarStockData | 函数签名 | autoLoadCsmarStockData(fileDir, dataSource, dbName="dfs://Csmar_Level2", tableName=NULL, market="ALL", startDate=NULL, endDate=NULL, parallel=1, initialDB=false, initialTB=false, isDataDuplicated=true) | high |
| autoLoadCsmarStockData | fileDir 约束 | 路径下第一级子目录必须为形如“20221201”的日期目录 | high |
| autoLoadCsmarStockData | dataSource 取值范围 | 只能在 "Snapshot", "Entrust", "Trade" 三选一 | high |
| autoLoadCsmarStockData | 默认数据库名 | dfs://Csmar_Level2 | high |
| autoLoadCsmarStockData | 默认表名规则 | 未指定 tableName 时默认表名为 "snapshot", "entrust", "trade"(随 dataSource) | high |
| autoLoadCsmarStockData | market 取值范围与行为 | market 只能为 "ALL", "SZSE", "SSE";ALL 时沪深导入同一张 tableName 表;否则创建 tableName+market(如 snapshotSZSE)并只导入指定市场 | high |
| autoLoadCsmarStockData | 日期参数含义 | startDate/endDate 为字符串(如“20220101”“20221231”),包含边界;为 NULL 则不判断 | high |
| autoLoadCsmarStockData | parallel 含义 | 并行度:控制后台提交的任务数目 | high |
| autoLoadCsmarStockData | initialDB 行为 | 若 dbName 数据库已存在:initialDB=true 删除并重建;否则保留并提示“[dbName] 数据库已经存在” | high |
| autoLoadCsmarStockData | initialTB 行为 | 若 dbName 下已存在 tbName 表:initialTB=true 删除并重建;否则保留并提示“数据库 [dbName] 已经存在表 [tbName]” | high |
| autoLoadCsmarStockData | 功能描述 | 将 fileDir 下 startDate 到 endDate 日期的股票 dataSource 数据导入 dbName 数据库的 tableName 表 | high |
| autoLoadCsmarFuturesData | 函数签名 | autoLoadCsmarFuturesData(fileDir, dataSource, dbName=NULL, tbName=NULL, markets="ALL", startDate=NULL, endDate=NULL, parallel=1, initialDB=false, initialTB=false) | high |
| autoLoadCsmarFuturesData | fileDir 约束 | 路径下第一级子目录必须为形如“20221201”的日期目录 | high |
| autoLoadCsmarFuturesData | dataSource 取值范围 | 支持 "TAQ"(十档行情), "Arbi"(套利深度行情), "MarchpriceQty"(分价成交量行情), "OrderStatistic"(委托统计行情), "OrderQueue"(委托队列), "BasicInfo"(静态数据) | high |
| autoLoadCsmarFuturesData | 默认数据库名规则 | 默认 "dfs://Csmar_Futures_" + dataSource;TAQ 默认 dfs://Csmar_Futures_TAQ | high |
| autoLoadCsmarFuturesData | 默认表名规则 | 默认表名为 dataSource;TAQ 默认 tbName 为 "TAQ" | high |
| autoLoadCsmarFuturesData | markets 参数行为 | 不同数据源支持的市场不同(见文档开头表格);market 指定时只导入指定市场到 tableName 表;market="ALL" 时导入该数据源支持的所有市场到同一张 tableName 表;示例:TAQ market=["CZCE","DCE","INE"] | high |
| autoLoadCsmarFuturesData | 功能描述 | 将 fileDir 下 startDate 到 endDate 日期的期货期权 dataSource 数据导入 dbName 数据库的 tableName 表,默认期货期权数据合并 | high |
| getJobStatus | 功能描述 | 查询后台任务中任务描述为 jobid 的任务状态 | high |
| getJobDetails | 功能描述 | 输出后台任务中任务描述为 jobid 的中间信息 | high |
| 模块同步位置 | 目标目录 | DolphinDB 的 sever/modules 目录(原文拼写为 _sever/modules_) | high |
| 股票数据导入示例 | 示例代码包含操作 | use DolphinDBModules::CsmarData::LoadCsmarData;login("admin","123456");设置 fileDir;调用 autoLoadCsmarStockData 导入 Snapshot/Entrust/Trade;使用 getJobStatus 查看状态 | high |
| 期货期权数据导入示例 | 示例代码包含操作 | use DolphinDBModules::CsmarData::LoadCsmarData;login("admin","123456");设置 fileDir;调用 autoLoadCsmarFuturesData 导入 TAQ/Arbi/MarchpriceQty/OrderStatistic/OrderQueue/BasicInfo;使用 getJobStatus 查看状态 | high |
| fileDir 查找日期目录规则 | 查找逻辑 | 从 fileDir 递归查找所有由8位数字组成的文件夹(如“20250221”),并将找到的日期与 startDate/endDate 做字符串比较以筛选导入日期;再在每个日期文件夹下递归查找所有 csv 文件获取绝对路径 | high |
| autoLoadCsmarStockData / autoLoadCsmarfuturesData | fileDir 必要条件 | fileDir 路径下必须有一层目录以8位日期命名(如“20250221”) | high |
| 导入单日数据的方式 | 建议/约束 | 导入一天数据需通过 startDate/endDate 控制导入日期,而不是通过 fileDir 参数 | high |
| 数据源与市场字段设置 | 文件查找依据 | 模块会按数据源名称与市场名称查找对应目录中的数据文件,名称需填写正确 | high |
| 期货期权分笔数据支持市场 | 市场列表 | CZCE、DCE、INE、CFFEX、SHFE、GFEX | high |
| markets="ALL" 的等价展开(期货期权分笔数据示例) | 等价市场数组 | ["CZCE","DCE","INE","CFFEX","SHFE","GFEX"] | high |
| CsmarData 模块 | 设计目标 | 专为处理 Level-2 高频数据设计;性能测试称内存占用率较理想并提供优化建议 | medium |
| 性能测试环境 | OS | CentOS Linux 7 (Core) | high |
| 性能测试环境 | 内核版本 | 3.10.0-1160.el7.x86_64 | high |
| 性能测试环境 | CPU | Intel(R) Xeon(R) Gold 5220R CPU @ 2.20GHz | high |
| 性能测试环境 | 内存 | 356G | high |
| 性能测试环境 | 磁盘 | 4块 SSD,3.5 TB 固态硬盘 SATA 读取密集型 6 Gbps 512 2.5 英寸 Flex Bay AG 硬盘;1 DWPD;单盘测试随机写平均写入IO:266MB/s | high |
| 股票导入性能(沪深合并存储)- snapshot | 性能指标 | 数据量 103,278,591;数据天数 5;耗时 37(min);RPS 4.6(W/s);吞吐量 22.1(MB/s);原始csv 48.0(GB);单副本磁盘 9.3(GB);压缩比 5.2;并发数 5;最大内存占用 10.4(GB) | high |
| 股票导入性能(沪深合并存储)- entrust | 性能指标 | 数据量 584,645,280;数据天数 5;耗时 36(min);RPS 27.7(W/s);吞吐量 67.6(MB/s);原始csv 142.6(GB);单副本磁盘 19.0(GB);压缩比 7.5;并发数 5;最大内存占用 9.9(GB) | high |
| 股票导入性能(沪深合并存储)- trade | 性能指标 | 数据量 773,129,257;数据天数 5;耗时 58(min);RPS 22.2(W/s);吞吐量 30.6(MB/s);原始csv 104.0(GB);单副本磁盘 16.4(GB);压缩比 6.3;并发数 5;最大内存占用 10.7(GB) | high |
| 期货期权导入性能(多市场合并)- TAQ | 性能指标 | 数据量 162,040,027;数据天数 5;市场 SHFE、DCE、INE、CFFEX;耗时 13(min);RPS 20.8(W/s);吞吐量 63.5(MB/s);原始csv 48.4(GB);单副本磁盘 7.6(GB);压缩比 6.37;并发数 5;最大内存占用 10.4(GB) | high |
| 期货期权导入性能(多市场合并)- OrderStatistic | 性能指标 | 数据量 71,790,026;数据天数 5;市场 DCE;耗时 7(min);RPS 17.1(W/s);吞吐量 8.1(MB/s);原始csv 3.3(GB);单副本磁盘 1.3(GB);压缩比 2.54;并发数 5;最大内存占用 17.7(GB) | high |
| 吞吐量提升建议 | 建议 1 | 通过设置参数 parallel 增加后台导入任务数,提高并行度(注意内存资源使用) | high |
| 吞吐量提升建议 | 建议 2 | 使用读写性能更好的硬盘;由于一个标的一个csv文件需循环读取很多文件,瓶颈往往是磁盘,内存占用不大 | high |
| 吞吐量提升建议 | 建议 3 | 数据分盘存储并从多个盘读取数据导入以提升吞吐量 | high |
| CsmarData 模块代码下载 | 下载链接 | https://link.zhihu.com/?target=https%3A//docs.dolphindb.cn/zh/tutorials/script/csmardata/CsmarData.zip | high |
| 异常处理 | 信息来源 | 导入过程中问题会在日志中输出对应报错提示信息 | high |
| 异常情况:创建数据库 | warning 输出条件与信息 | dbName 数据库已存在且 initialDB=false -> {"code":"warning","message":"[dbName] 数据库已经存在"} | high |
| 异常情况:创建分布式表 | warning 输出条件与信息 | tableName 表已存在且 initialDB=false -> {"code":"warning","message":"数据库 [dbName] 已经存在表 [tableName]"} | high |
| 异常情况:数据导入时无日期目录 | warning 输出条件与信息 | fileDir 下没有形如“20250221”的文件夹 -> {"code":"warning","message":"[fileDir] 路径下没有找到指定日期的文件夹,请确认文件路径"} | high |
| 异常情况:不支持的数据源 | error 输出条件与信息 | 股票 dataSource 不在 Snapshot/Entrust/Trade 或期货期权 dataSource 不在 TAQ/Arbi/MarchpriceQty/OrderStatistic/OrderQueue/BasicInfo -> {"code":"error","message":"数据源 [dataSource] 暂时不支持"} | high |
| 异常情况:不支持的市场 | error 输出条件与信息 | 股票 market 不属于 ALL/SSZ/SZSE 或期货期权 market 不在支持市场列表 -> {"code":"error","message":"市场 [market] 暂时不支持"} | medium |
| 异常情况:日期格式有误 | error 输出条件与信息 | startDate/endDate 不是 NULL 或不符合“20250221”格式 -> {"code":"error","message":"开始日期 [startDate] 格式有误"} 与 {"code":"error","message":"结束日期 [endDate] 格式有误"} | high |
| 异常情况:csv 列数不匹配 | error 输出条件与信息 | 实际 csv 列数与 CsvSchema.dos 预设表结构列数不一致 -> {"code":"error","message":"[csvPath] 的数据格式有误,列数不匹配"} | high |
| 异常情况:日期目录下 csv 不全或不存在 | error 输出条件与信息 | 示例输出:"深交所 [day] 日期的 [csvNames] 的 csv 文件不全或者不存在";"上交所 [day] 日期的 [csvNames] 的 csv 文件不全或者不存在" 等 | high |
| 异常情况:其他错误 | 捕获方式与输出 | 通过 try{}catch(ex){} 捕获异常;输出报错信息 ex | high |