TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案

简介: 在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。

在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。

本工具通过分析样本数据,提供最佳压缩率的检测结果,并同时输出与之相关的两个关键性能指标:写入速度和查询速度。由于写入过程中涉及数据压缩,压缩效率越高,写入速度越快;而查询过程中则需要解压数据,解压效率越高,查询速度越快。借助这些指标,用户可以根据实际需求,在存储效率与访问性能之间找到最佳平衡,选择最适合自己数据的压缩算法。

下载和安装

  1. 本工具为开源工具,使用 python 编写
  2. 工具下载地址:https://github.com/taosdata/TDengine/tree/3.0/tools/auto/testCompression
  3. 本工具为绿色软件,下载后即可使用,无需安装

使用指南

文件说明

  1. testCompression.py:主程序文件,运行时需依赖 json/template.json。
  2. json 目录: 存放运行 taosBenchmark 所需的 JSON 和 CSV 文件。
  3. json/tempalte.json:taosBenchmark 用于生成不同二级压缩算法的模板文件,文件名固定不可修改,格式与使用方法详见官网文档: https://docs.taosdata.com/reference/tools/taosbenchmark/。模板文件中使用宏 @COMPRESS 表示压缩算法名。支持的四种压缩算法分别为:zlib、xz、zstd、lz4,以及 disabled(关闭二级压缩)。
  4. d0_10w.csv.zip: 测试样本数据文件(10 万条数据)。使用前需解压至当前目录,在 template.json 中有引用。
  5. query.json:报告中 query-QPS 指标的来源,通过 taosBenchmark 测试查询性能,使用可详见官网taosBenchmark 使用说明。
  6. generate.json:配置文件用于通过 taosBenchmark 生成样例数据 d0_10w.csv。可以修改此 json 生成更大规模的数据集(如 100 万或更多)。

使用步骤

  1. 前置条件:
    1. 确认已安装 TDengine 3.3.2.0 及以上版本
    2. 确认已安装 python3
    3. 确认已安装 TDegnine 的 python3 连接器 taospy
    4. 确认 taosd 服务已启动,执行 taos 可正常连接 TDengine
    5. 确认 taosBenchmark(安装包中自带) 能运行
  2. 进入仓库源码目录 testCompression
  3. 解压 json\d0_10w.csv.zip 到当前 json 目录,确认 d0_10w.csv 在 json 目录下存在
  4. 在 testCompression 目录下执行 python3 ./testCompression.py 运行主程序启动检测
  5. 输出测试报告,测试完成。历史测试报告记录在 ./result.txt
    操作步骤:

    # 安装 TDengine python 连接器
    pip3 install taospy
    # 下载 TDengine 开源代码仓库
    git clone https://github.com/taosdata/TDengine.git
    # 进入工具目录
    cd TDengine/tools/auto/testCompression
    # 解压测试样本数据集
    unzip json/d0_10w.csv.zip -d ./json/
    # 运行主程序
    python3 testCompression.py
    # 查看测试报告
    cat ./result.txt
    

    输出报告

    为了检测更精准,在上一步示例操作中把 tempalte.json 文件中子表数 childtable_count 从 1 改为 10 ,数据规模扩大 10 倍到 100w 后得到的检测数据如下:
    数据分布说明:100w 数据是把 csv 文件中 10w 数据复制出 10 份放到 10 个子表中的
    af12121e6e2b29b4fe8bfea3436f5693_b8a23a95-d682-4078-95ad-0b366f1784c0.png
    从结果可以看出,此样本数据下最好的 xz 压缩算法与最差的 lz4 之间压缩率差距还是很大的。

    格式说明:
    1.第一行括号中的时间为测试开始时间,最后一行为测试完成时间。
    2.2 ~ 4 行是记录 taosBenchmark json 文件中的几个重要信息,VGROUPD 数量,子表数量及生成子表行数。
    3.下面 5 ~ 10 行为报告内容,各列如下:
    No: 序号
    compress: 压缩算法
    dataSize: 磁盘上压缩后数据文件大小
    rate: 压缩率
    writeSpeed: 写入速度 (单位:写入行数/每秒)
    query-QPS: 查询 QPS(单位: 查询请求数/每秒) ,查询 sql 可在 json/query.json 中指定
    4.重点说下 rate (压缩率)的计算:
    分母:
    1)对于固定长度数据类型,分母即约定的长度 bool ( 1 字节)tinyint ( 1 字节) smallint ( 2 字节) int ( 4 字节) 等
    2)对于可变长度数据类型,如 varchar, binary , nchar 等,分母是在建表时创建字段时指定的长度,如 varchar(12) 即 12 字节
    分子:压缩后数据的实际大小
    此压缩率是以超级表为统计单位,统计的是超级表及其所有子表。

    更换样本

    更换为自己的样本数据,需要修改以下几处:
    a.更换 CSV 文件
    若你的数据已在 TDegnine 中,可以通过 taos-CLI 工具导出。
    重点强调下,一个 csv 文件中只能存放一张子表数据。
    选择一个最具代表数据特征的子表,假设为 d0,可以使用 select * from d0 >> d0.csv 命令完成导出,导出后的 csv 需删除第一行(第一行是列名, 非数据,需删除)。
    步骤如下:

    j# taos-CLI 中导出表数据到 csv 
    select * from d0 >> d0.csv
    # shell 中删除 csv 首行
    sed -i '1d' d0.csv
    

b.template.json 中做相应修改

1. "prepared_rand": 100000  一定要改为大于或等于你的 CSV 文件行数
2. "sample_file": "./json/d0_10w.csv"  改成你 csv 文件路径
3. "use_sample_ts": "yes",   如果你的 csv 文件中第一列是时间主列,保持 yes 不动,即写入数据的时间使 用 csv 文件中的第一列时间。如果你的 csv 文件没有时间列的,改成 no,由 taosBenchmark 帮你生成时间列,生成时间的开始时间由"start_timestamp" 指定,步长由 "timestamp_step" 指定,每个子表生成的记录数由 "insert_rows" 指定。
4. "childtable_count": 1, CSV 文件写入到几个子表中,每个子表写入数据都是和 CSV 中数据是相同的,填写你期望的数量。
5. "columns": 更换成与你 CSV 文件中数据相匹配的列类型

示例:
如你的 CSV 文件有 100 万行, 你希望能把写入数据规模扩大 10 倍,那按照如下黄色背景标记地方修改即可:

j{
    "filetype": "insert",
    ...
    "prepared_rand": 1000000,
    "databases": [
        {
            "dbinfo": {
                "name": "dbrate",
                ...
            },
            "super_tables": [
                {
                    "name": "meters",
                    "childtable_count": 10,
                    "childtable_prefix": "d",
                    "insert_rows": 1000000,
                    ...
                }
            ]
        }
    ]
}

检测方法

  1. 整体检测
    这种方式是通过按用户实际建表结构和实际数据进行整体压缩率测试,上述示例即属于这种,一个 CSV 文件中混合着表的所有数据类型,对所有数据类型整体上评估最佳压缩算法。该方法优点是操作简单,检测速度快,但却无法针对不同数据类型的列分别优化,可能会忽略各列数据类型对应的最佳压缩算法。
  2. 单数据列检测
    单数据列检测方式将用户实际建表中的所有列按数据类型分组,例如,如果表中包含四种数据类型,则分为四组,每组分别进行一次测试。该方法的优势在于,CSV 文件中仅保留时间列和指定的数据类型列,使得检测结果更加精确,能够准确找到该数据类型的最佳压缩率。但其缺点是需要进行多轮操作,增加了测试的复杂性和时间成本。

    常见问题

  3. 我的数据样本应该多大合适?
    原则上,数据越大,检测压缩率越准确。建议 CSV 文件的行数不少于 1 万,写入数据库的总行数不少于 100 万。通过配置多个子表写入,可以进一步放大样本数量,提升测试的精度。
  4. 我已知某列最佳压缩算法,不想再每轮测试中再改变,怎么办?
    我们的目标是找出每列数据的最佳压缩算法。当已知某列的最佳压缩算法时,可在 template.json 中直接用具体算法名替换 @COMPRESS 宏,这样在测试过程中,该列的压缩算法将保持不变。
  5. TDengine 都支持哪些压缩算法?
    压缩算法支持列表请参考官网:https://docs.taosdata.com/reference/taos-sql/compress/
  6. 如何在 template.json 中定义数据类型?
    在 csv 测试样本数据中,每一列数据都需要在 template.json 中声明数据类型。可参考 taosBenchmark 使用说明 最后一节的“数据类型书写对照表”,确保数据类型定义正确:https://docs.taosdata.com/reference/tools/taosbenchmark/

    结语

    通过该工具,用户可以更高效地测试并选择最适合自身数据的压缩算法,不仅提升存储效率,还能在性能和存储之间取得最佳平衡。无论是整体压缩测试还是单数据列检测,该工具都为不同需求提供了灵活的方案,帮助用户快速找到解决方案。同时,如果您在使用过程中有任何疑问或遇到问题,欢迎访问我们的开源社区:https://github.com/taosdata 与社区成员互动,或发送邮件至 kjduan@taosdata.com 与我们联系。
目录
相关文章
|
12天前
|
机器学习/深度学习 人工智能 算法
"拥抱AI规模化浪潮:从数据到算法,解锁未来无限可能,你准备好迎接这场技术革命了吗?"
【10月更文挑战第14天】本文探讨了AI规模化的重要性和挑战,涵盖数据、算法、算力和应用场景等方面。通过使用Python和TensorFlow的示例代码,展示了如何训练并应用一个基本的AI模型进行图像分类,强调了AI规模化在各行业的广泛应用前景。
23 5
|
13天前
|
人工智能 算法 前端开发
无界批发零售定义及无界AI算法,打破传统壁垒,累积数据流量
“无界批发与零售”是一种结合了批发与零售的商业模式,通过后端逻辑、数据库设计和前端用户界面实现。该模式支持用户注册、登录、商品管理、订单处理、批发与零售功能,并根据用户行为计算信用等级,确保交易安全与高效。
|
13天前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
17天前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
20 0
|
17天前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
43 0
|
7天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
25天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
4天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
5天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。