DolphinDB 内存分区表的加载和操作
本页是一篇介绍 DolphinDB 内存表(含分区内存表)加载与操作的文章导语与说明,并提到分区适用范围与并行计算相关优势。
Source: https://dolphindb.cn/blogs/75
What this page covers
- 活动推广与报名入口信息。
- 文章信息与对内存分区表主题的导语说明。
- 创建非分区内存表与分区内存表的方法与注意事项。
- 将数据加载到未分区/分区内存表的多种导入方式与适用场景。
- 围绕示例表的插入、更新、删除与结构管理等常见操作。
技能认证特训营第二期报名推广
页面顶部提供活动推广内容,并给出限时报名链接。
- 页面包含“技能认证特训营第二期”的报名入口信息。
- 报名链接指向 qingsuyun.com 的页面。
DolphinDB 内存分区表的加载和操作(文章信息与导语)
本节给出文章标题、作者与日期,并说明内存数据表的分区类型适用范围及并行计算相关优势。
- 文章发布日期为 2021-08-05。
- 文章作者署名为 Junxi。
- DolphinDB 内存数据表可以是非分区或分区形态。
- 除组合分区外,多种分区方式可用于内存数据表。
- 分区内存表运算被描述为可发挥多核 CPU 并行计算优势。
创建内存数据表
本节介绍创建非分区内存表与分区内存表的方法,并提示创建与访问方面的注意事项。
- table 函数可用于创建非分区内存表。
- table(X,[X1],[X2],...) 的输入可为向量、矩阵或元组。
- table(X,[X1],[X2],...) 要求各列长度一致。
- table(capacity:size, colNames, colTypes) 可按容量/初始大小与列信息建表。
- 记录行数超出 capacity 时表会自动扩展。
- size 设为 0 可创建空表。
- size>0 时创建表会使用默认值填充。
- createPartitionedTable 函数可创建分区内存表。
- 创建分区内存表前需建立“内存分区数据库”,路径为空字符串。
- 内存分区表不能直接访问,需要使用 SQL 语句访问。
加载数据到内存表
本节通过模拟数据与多种导入函数,展示加载到未分区与分区内存表的方式,并给出适用场景与部分限制说明。
- 模拟数据集(trades)生成脚本包含参数 n=30000000。
- 示例 workDir 为 C:/DolphinDB/Data。
- loadText 可将文本文件数据导入到未分区的内存表。
- ploadText 可将文本文件导入为顺序分区的内存表。
- ploadText 方式要求文本文件小于可用内存。
- ploadText 方式被描述为无法用 sortBy! 做分区内有意义排序(等)。
- loadTextEx 可将文本文件导入为指定分区方式的表。
- loadTextEx 适用于分区内经常需要排序的情况。
- loadTextEx 适用于基于分区字段做 group by 或 context by 计算的情况。
- loadTextEx 相关的 directory 与 tableName 参数需使用空字符串("")。
- 内存分区表上的 sortBy! 是分区内排序,不是全表排序。
- timer(10) 的 SQL 说明为连续执行 10 次的总耗时。
- 当分组列与分区列相同时,分组计算性能被描述为最优。
- loadTable 可将磁盘分区表的全部或部分分区导入到内存表。
- loadTable 适用于文本文件大于可用内存且每次只需部分数据的场景。
- loadTable 适用于需要重复使用数据的场景。
- loadTable 的 memoryMode 需要设为 1,否则只加载元数据。
- loadTableBySQL 可通过 SQL 选择磁盘分区表的行/列载入内存分区表。
- loadTableBySQL 被描述为需与 loadTable 结合使用。
- loadTableBySQL 被描述为最灵活的方法(原文表述,低置信度)。
内存表的数据处理
本节以示例 trades 表为对象,概述内存表的常见数据处理操作,包括插入、更新、删除与表结构管理等。
- 内存表插入数据方式包含:SQL insert、append!、tableInsert。
- append! 插入要求新数据以“表”的形式表示。
- tableInsert 会返回插入的行数。
- 分区表上的 tableInsert 要求新数据以“表”的形式表示。
- 未分区表上的 tableInsert 允许新数据用元组形式表示。
- 内存表增加列方式包含:SQL update、update!、赋值语句。
- 内存表更新列方式包含:SQL update、update!、赋值语句。
- 内存表删除行方式包含:SQL delete 与 erase 语句。
- drop! 可用于删除列(示例为 trades.drop!("qty1"))。
- rename! 可用于重命名列(示例为 trades.rename!("qty2","qty2New"))。
- schema 函数可用于查看表结构。
- 删除内存表方式包括 undef 与将变量赋值为 NULL。
- undef 会删除命名空间;赋值为 NULL 仍保留命名空间。
- replaceColumn! 可用于修改列的数据类型。
- 修改列数据类型目前仅未分区内存表支持,分区内存表不支持。
- reorderColumns! 可用于修改列的顺序。
- 原文在列顺序段落中也出现“仅未分区表支持修改列数据类型”的限制表述。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 文章 | 发布日期 | 2021-08-05 | high |
| 文章作者 | 署名 | Junxi | high |
| DolphinDB 内存数据表 | 分区形态 | 可以是非分区的,也可以是分区的 | high |
| DolphinDB 内存数据表分区方式 | 适用范围 | 除组合分区以外的所有分区方式都适用于内存数据表 | high |
| 分区内存表运算 | 性能优势原因 | 能充分发挥多核CPU并行计算的优势 | medium |
| table 函数 | 用途 | 可创建非分区内存表 | high |
| table(X,[X1],[X2],...) | 输入数据类型 | X, X1, X2 可以是向量、矩阵或元组 | high |
| table(X,[X1],[X2],...) | 长度要求 | 每个向量、矩阵和元组中每个元素的长度必须相同 | high |
| table(capacity:size, colNames, colTypes) | 用途 | 可通过指定容量/初始大小、列名、列类型创建内存表 | high |
| table(capacity:size, colNames, colTypes) | capacity 超出行为 | 当实际记录行数超出 capacity 时会自动扩展 | high |
| table(capacity:size, colNames, colTypes) | 创建空表方式 | 可将 size 设置为 0 创建空表 | high |
| table(capacity:size, colNames, colTypes) | size>0 行为 | size>0 时创建表会使用默认值填充 | high |
| createPartitionedTable 函数 | 用途 | 可创建分区内存表 | high |
| 分区内存表创建前置条件 | 分区数据库要求 | 需要创建内存的分区数据库,且分区数据库路径为空字符串 | high |
| 内存分区表 | 访问方式限制 | 不能直接访问,需要使用SQL语句访问 | high |
| 模拟数据集(trades)生成脚本 | 行数参数 | n=30000000 | high |
| 模拟数据集(trades)生成脚本 | workDir 示例 | C:/DolphinDB/Data | high |
| loadText 函数 | 用途 | 将文本文件数据导入到未分区的内存表 | high |
| ploadText 函数 | 用途 | 将文本文件导入为顺序分区的内存表(导入到内存分区表的简单方法) | high |
| ploadText 导入方式 | 限制/缺点 | 需要导入的文本文件必须小于可用内存;无法使用 sortBy! 进行分区内有意义的排序(等) | medium |
| loadTextEx 函数 | 用途 | 将文本文件导入为指定分区方式的表 | high |
| loadTextEx 方法 | 适用情况 | 经常需要在各个分区内部进行排序;经常需要根据分区字段进行 group by 与 context by 的计算 | high |
| loadTextEx 方法 | 参数要求 | database 函数的 directory 参数以及 loadTextEx 函数的 tableName 参数需使用空字符串("") | high |
| 内存分区表上的 sortBy! | 排序范围 | 是在每个分区内部进行排序,并不是对全表进行排序 | high |
| timer(10) SQL 说明 | 含义 | 该语句被连续执行10次的总耗时 | high |
| 分组聚合性能结论 | 最优条件 | 当分组列和分区列相同时,分组计算性能最优 | medium |
| loadTable 方法 | 用途 | 可导入磁盘分区表的全部或部分分区到内存表 | high |
| loadTable 方法 | 适用情况 | 文本文件比服务器可用内存更大且每次只需部分数据;需要重复使用数据(加载数据库表比导入文本文件更快) | high |
| loadTable 可选参数 memoryMode | 要求 | 需要设为 1,否则只会加载表的元数据 | high |
| loadTableBySQL 方法 | 用途 | 通过SQL选择磁盘分区表指定行/列载入内存分区表(需与 loadTable 结合使用) | high |
| loadTableBySQL 方法 | 灵活性描述 | 这是最灵活的产生内存分区表的方法 | low |
| 内存表插入数据方式 | 方法列表 | SQL insert 语句;append! 函数;tableInsert 函数 | high |
| append! 往表插入数据 | 数据形式要求 | 新数据必须以表的形式表示 | high |
| tableInsert 函数 | 返回值 | 会返回插入的行数 | high |
| 分区表上的 tableInsert | 数据形式要求 | 新数据必须以表的形式表示 | high |
| 未分区表上的 tableInsert | 数据形式要求 | 新数据可以用元组的形式表示 | high |
| 内存表增加列方式 | 方法列表 | SQL update 语句;update! 函数;赋值语句 | high |
| 内存表更新列方式 | 方法列表 | SQL update 语句;update! 函数;赋值语句 | high |
| 内存表删除行方式 | 方法列表 | SQL delete 语句;erase 语句(示例为 trades.erase!) | high |
| drop! 函数 | 用途 | 删除列(示例:trades.drop!("qty1")) | high |
| rename! 函数 | 用途 | 重命名列(示例:trades.rename!("qty2", "qty2New")) | high |
| schema 函数 | 用途 | 查看表的结构 | high |
| 删除内存表方式 | 方法列表 | undef 函数;把变量赋值为 NULL | high |
| undef 与赋值为 NULL 的区别 | 命名空间影响 | undef 会将命名空间删除;把变量赋值为 NULL 仍然保留命名空间 | high |
| replaceColumn! 函数 | 用途 | 修改列的数据类型 | high |
| 修改列的数据类型 | 支持范围 | 目前只有未分区的内存表支持;分区内存表不支持 | high |
| reorderColumns! 函数 | 用途 | 修改列的顺序 | high |
| 修改列的顺序相关限制描述 | 支持范围(按原文表述) | 目前只有未分区的内存表才支持修改列的数据类型,分区内存表不支持该功能(原文在列顺序段落中出现此表述) | medium |
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |