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 与我们联系。
目录
相关文章
|
5月前
|
监控 安全 算法
137_安全强化:输入过滤与水印 - 实现输出水印的检测算法与LLM安全防护最佳实践
随着大语言模型(LLM)在各行业的广泛应用,安全问题日益凸显。从提示注入攻击到恶意输出生成,从知识产权保护到内容溯源,LLM安全已成为部署和应用过程中不可忽视的关键环节。在2025年的LLM技术生态中,输入过滤和输出水印已成为两大核心安全技术,它们共同构建了LLM服务的安全防护体系。
622 148
|
5月前
|
机器学习/深度学习 算法 前端开发
别再用均值填充了!MICE算法教你正确处理缺失数据
MICE是一种基于迭代链式方程的缺失值插补方法,通过构建后验分布并生成多个完整数据集,有效量化不确定性。相比简单填补,MICE利用变量间复杂关系,提升插补准确性,适用于多变量关联、缺失率高的场景。本文结合PMM与线性回归,详解其机制并对比效果,验证其在统计推断中的优势。
1509 11
别再用均值填充了!MICE算法教你正确处理缺失数据
|
6月前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
433 1
|
6月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
508 0
|
6月前
|
传感器 资源调度 算法
DDMA-MIMO雷达多子带相干累积目标检测算法——论文阅读
本文提出一种多子带相干累积(MSCA)算法,通过引入空带和子带相干处理,解决DDMA-MIMO雷达的多普勒模糊与能量分散问题。该方法在低信噪比下显著提升检测性能,实测验证可有效恢复目标速度,适用于车载雷达高精度感知。
789 4
DDMA-MIMO雷达多子带相干累积目标检测算法——论文阅读
|
5月前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
6月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
185 3
|
5月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
257 0
|
6月前
|
算法 数据挖掘 定位技术
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
164 1
|
5月前
|
存储 监控 算法
基于 PHP 布隆过滤器的局域网监控管理工具异常行为检测算法研究
布隆过滤器以其高效的空间利用率和毫秒级查询性能,为局域网监控管理工具提供轻量化异常设备检测方案。相比传统数据库,显著降低延迟与资源消耗,适配边缘设备部署需求,提升网络安全实时防护能力。(238字)
234 0

热门文章

最新文章