当前位置: 首页 > news >正文

从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?

小T导读:TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务,轻松应对海量功率、电能及输入输出数据的实时统计与分析,并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外,taosX 强大的 transform 功能帮助用户完成原始数据的清洗和结构优化,而其零代码迁移能力更实现了历史数据从 TDengine OSS 与 MySQL 到 TDengine 企业版的平滑迁移,全面提升了企业的数据管理效率。本文将详细解读这一实践案例。

1.背景概述

随着光伏、电池等技术的不断进步,家庭储能、户外储能市场蓬勃发展,广州疆海科技有限公司旗下的 “Zendure(征拓)” 致力于家庭储能和能源管理系统的研发与销售,用户遍布全球。

对储能设备进行能量分析是 Zendure 的关键业务之一。这一动作能够帮助用户实时掌握储能设备的运行状态,通过对功率、电能以及输入输出数据此类典型的时序数据进行精准统计与分析,用户可清晰了解设备的能效表现与能源使用情况,轻松实现精细化管理和优化决策。

最初,我们采用关系型数据库管理储能设备的时序数据,但随着数据规模的迅猛增长,很快遇到了性能瓶颈,不得不寻找更高效的解决方案。在数据库选型过程中,我们了解到时序数据库 TDengine,其独特的“一设备一张表”数据模型、“超级表-子表”架构,以及卓越的性能表现,与我们的储能设备数据管理需求高度契合。

我们最初使用 TDengine OSS 开源版本进行业务数据存储,随着业务规模扩大和功能需求增加,2024 年正式升级至TDengine 企业版。借助 taosX 强大的数据接入与迁移能力,在涛思技术团队的支持下,我们不仅高效迁移了开源版的历史数据,还完成了 MySQL 存储数据的 transform 结构优化,并顺利导入 TDengine 企业版集群,实现了历史数据迁移、业务切换及表结构优化,确保系统平稳过渡,为储能业务的进一步发展奠定了坚实基础。

2.能量分析业务

2.1 问题描述

能量分析业务既需要从业务维度将数据分为功率、电能、输入输出这 3 类,分类别进行统计查询,又需要从设备维度,按每个设备的 device 信息进行统计查询。过去使用关系型数据库,无论是按照业务建表还是按照设备建表均无法很好地满足业务需求。

2.2 TDengine 解决方案

2.2.1 超级表设计

结合业务需求以及 TDengine “一个设备一张表” 数据模型,“超级表-子表” 组织结构,我们对设备储能数据的组织方式如下:

创建了 3 张超级表,分别对应设备的功率数据、电能数据以及输入输出数据。而每个设备的数据分别记录在超级表下的对应子表中,同时兼顾了业务维度与设备维度对数据组织的需求,如下图所示。

经过测试验证以及实际业务检验,TDengine 能够很好地支持储能设备能量分析业务,查询速度和数据压缩率表现都很优异。

2.2.2 高速查询

查询案例 1 :

统计 2024 年 9 月以来,每个设备每天的 energy 总和,查询语句和耗时记录如下,我们可以看到返回 100 余万笔统计结果,仅耗时 1 秒多。

查询案例 2:

查询设备 id 为 100048,在 2024-11-09 当天,全天的电力输入输出数据,返回 258 条数据耗时 0.513 秒。

2.2.3 高效压缩

使用 TDengine 的另一个优势,在于数据压缩率高。我们的数据服务部署在亚马逊云上,高压缩率给我们节省了很多成本。

对于功率、电能、输入输这 3 张超级表,数据压缩率分别达到了 5.34 %、5.95 %、8.63 % 。(数据压缩率指 data 文件中 实际占用的空间 / 无压缩状态下数据占用的空间 * 100%)。

2.2.4 应用界面展示

目前该项目运行中的储能设备数量已经超过 3 万台/套,系统运行稳定高效。部分数据查询页面如下图所示:

3. TDengine - TDengine 历史数据迁移

3.1 问题描述

采购企业版后,在涛思技术团队的协助下,我们在亚马逊云上成功部署了 3 节点集群。随之而来的挑战是如何在不中断原有业务的情况下,将开源版集群中一年的历史数据平稳迁移至新集群,并在大部分数据同步完成后再执行业务切换。

历史数据的大规模迁移一向是数据运维的难题,但幸运的是,TDengine 企业版内置了 taosX 组件,提供零代码数据接入能力,使得迁移过程更加高效便捷。

3.2 TDengine 解决方案

为尽快同步历史数据,同时保留对基础性能参数的调整灵活性,涛思技术团队采用 taosX 命令行模式,通过原生连接方式进行数据迁移操作。

taosx run -f "taos://root:XXXX@node1:6030/zendure_db?schema=none&unit=2d&start=2024-08-01T00:00:00Z&end=2024-09-01T00:00:00Z&libraryPath=/data/taos/soft/libtaos.so.3.0.7.1" -t 'taos://root:XXXX@tdengine-enterprise-eu-1:6030/zendure_db?fails-to=/data/error_db_sync_M08.log' -j 10

上述命令行(密码用 XXXX 替换),能够从源端(-t),TDengine版本号为 3.0.7.1,hostsname 为 tdengine-enterprise-eu-1 的节点,以原生连接(6030)的方式将 dbname 为 zendure_db ,时间段为 2024-08-01 到 2024-09-01 的历史数据迁移到目标端(-f)。通过控制 -j 参数限制并发线程数,避免数据迁移操作对源端产生过大的影响。

在业务低谷期,按时间段倒叙迁移,每天迁移 3-4 个月的历史数据,最终我们成功在国庆假期之前完成了历史数据的迁移。

4. 超级表 schema 变更

4.1 问题描述

在最初使用 TDengine OSS 管理数据时,由于对其特性尚不熟悉,业务模式未完全梳理清晰,导致部分超级表的设计不够合理。例如,一些原本适合作为 tag 列的字段被误设为数据列,造成了不必要的磁盘空间浪费;部分超级表则需要新增 tag 列,以优化数据管理和查询效率。

由于这些表结构变更较为复杂,无法直接通过简单的增删数据列或 tag 列完成调整。为此,涛思技术团队协助设计了一套基于 CSV 文件的数据中转方案,并结合 taosX 与 taosExplorer 高效完成数据迁移,确保数据结构优化的同时,平稳过渡至新的存储架构。

4.2 TDengine 解决方案

实施思路

  1. 以 csv 文件作为数据中转形态

  2. 通过 taos shell 执行 SQL 语句,将原超级表数据批量导出到 csv 文件中

  3. 利用 TDengine 自带工具 taosX、taosExplore所具备的批量 csv 文件解析写入功能,将导出到 csv 文件中的原始数据按照新的表结构写入到新超级表中。

操作步骤

  1. 创建新数据库与新表

  2. 将原表数据分批次导出到 csv 文件中

  3. 创建 csv 写入任务

  4. 字段映射

  5. 执行数据写入并监测任务运行情况

  6. 数据正确性检验

  7. 业务迁移

  8. 遗留数据迁移

  9. tag 赋值

关键步骤介绍

数据导出到 csv 文件与数据重新映射并写入 TDengine 是两个关键步骤。

首先,通过 taos shell 执行 SQL 语句,即可按指定时间范围导出历史数据至 CSV 文件。例如,使用以下 SQL 语句即可导出特定时间段的数据:

select tbname, * from test.meters where ts >='2017-07-14 10:00:00' and ts <'2017-07-14 11:00:00'>> /root/test/1.csv; 
select tbname, * from test.meters where ts >='2017-07-14 11:00:00' and ts <'2017-07-14 11:30:00'>> /root/test/2.csv; 
select tbname, * from test.meters where ts >='2017-07-14 11:30:00' and ts <'2017-07-14 12:00:00'>> /root/test/3.csv; 

在 taosExplorer 中配置数据源,以及数据在新建超级表中的映射关系,即可实现变更表结构的需求。

我们可按照如下步骤配置数据源:

解析成功后,在“映射”选项卡中,配置新旧超级表之间的映射关系,在这一步将原始数据映射到新的表结构中。

在涛思技术团队的协助下,最终我们成功实现了表结构的变更与数据的迁移。

5.从 MySQL 迁移数据到 TDengine

5.1 问题描述

过去,一些历史数据存储在 MySQL 中,随着企业版 TDengine 的部署,我们希望将这些数据迁移至 TDengine集群进行统一管理。然而,由于 MySQL 与TDengine 的建表方式存在较大差异,我们需要对字段进行映射,并筛选出符合需求的部分数据进行导入。在涛思技术团队的支持下,我们借助 taosX 高效完成了数据筛选、结构映射及迁移,实现了 MySQL 历史数据的顺利接入。

5.2 TDengine 解决方案

taosX 可通过配置 SQL 语句从 MySQL 数据源查询所需数据,并将其映射至 TDengine 已创建的超级表或子表,实现数据的高效接入与迁移。SQL 配置界面如下图所示:

在迁移过程中,我们遇到了 taosX 无法识别 MySQL 时间戳字段的问题。通过使用 UNIX_TIMESTAMP 函数将 MySQL 的时间戳转换为 UNIX 时间戳,成功解决了该问题。

此外,MySQL 可存储所有时间戳相同的数据,而 TDengine 仅保留相同时间戳的最后一条记录。为满足业务需求,我们将 type 数据列的信息叠加到毫秒级时间戳中,在不使用复合主键的情况下,实现了类似的效果。

最终采用的 SQL 语句如下:

SELECT t.consumer_id,device_id,UNIX_TIMESTAMP(t.create_time)*1000+type as ts,power,typeFROMt_device_inout_power_record t,t_device d,t_product pt where t.device_id=d.id and d.product_id=pt.id and pt.product_type_id in (3,4) andcreate_zone_time>'2023-1-1';

对从 MySQL 查询出来的数据进行映射处理:

任务执行完成后的指标如下,可以看到总计导入了四千多万行数据,完成了数据从 MySQL 向 TDengine的迁移。

6.结语

时序数据的迅猛增长曾给我们带来查询效率和存储成本的挑战,而 TDengine 的引入成功解决了这些问题。尤其值得一提的是 taosX 组件,其零代码数据迁移能力大幅降低了开发时间和成本,让数据管理更加高效便捷。

家庭储能与户外储能市场仍在快速发展,对时序数据的高效管理需求也将持续增长。未来,我们期待与 TDengine 携手,共同助力中国企业扬帆出海,为全球能源管理贡献更多力量。

本文作者:疆海科技 马老师

关于疆海科技

广州疆海科技有限公司创立于 2017 年,是一家设计与技术驱动的国家高新技术企业,致力于家庭储能和能源管理系统的研发与销售。公司目前累计申请专利 70 多项,已有专利 60 多项;产品多次获得德国红点、德国 iF 和日本 G-Mark 设计大奖。公司旗下的“Zendure(征拓)”品牌在欧美有较高知名度,在全球各地有大量忠实用户。目前公司的分销渠道覆盖欧美中东日本等全球 63 个国家,上千家线下门店,并且通过亚马逊等电商平台直接面向消费者销售,是中国出海品牌中少有的拥有完善的线上线下渠道的品牌之一。

相关文章:

从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?

小T导读&#xff1a;TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务&#xff0c;轻松应对海量功率、电能及输入输出数据的实时统计与分析&#xff0c;并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外&#xff0c;taosX 强大的 transform 功能帮助用…...

华为OD机试A卷 - 积木最远距离(C++ Java JavaScript Python )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处…...

Zerotier虚拟局域网在树莓派的应用和Syncthing配合Zerotier实现端到端文件同步

一、Zerotier的部署 1、官网注册账号 https://my.zerotier.com/i 2、选择linux系统&#xff0c;执行安装Zerotier curl -s https://install.zerotier.com | sudo bash3、将树莓派网络加入Zerotier zerotier-cli join DB62228FEDF6CE55DB62228FEDF6CE55 为你的Zerotier IP 需…...

C++设计模式-桥梁模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、桥梁模式基本介绍 桥梁模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;又叫桥接模式&#xff0c;其核心思想是将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。这种模式通过组合代替继承&#xff0c;有效解决了多层继承导致的类爆…...

系统转换、系统维护、净室软件工程、构件软件工程(高软51)

系列文章目录 系统转换、系统维护、净室软件工程、构件软件工程 文章目录 系列文章目录前言一、系统转换二、系统维护三、净室软件工程四、基于构件的软件工程总结 前言 本节讲明遗留系统的系统转换、系统维护、净室软件工程、基于构件软件工程相关知识。 一、系统转换 就是讲…...

自然语言处理(13:RNN的实现)

系列文章目录 第一章 1:同义词词典和基于计数方法语料库预处理 第一章 2:基于计数方法的分布式表示和假设&#xff0c;共现矩阵&#xff0c;向量相似度 第一章 3:基于计数方法的改进以及总结 第二章 1:word2vec 第二章 2:word2vec和CBOW模型的初步实现 第二章 3:CBOW模型…...

Docker镜像迁移方案

Docker镜像迁移方案 文章目录 Docker镜像迁移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;异常原因参考&#xff1a; 一&#xff1a;背景 比如机器上已经有先有的容器&#xff0c;但是docker pull的时候是失败的二&#xff1a;操作方式 1、停止正在运行的容器…...

深度学习框架PyTorch——从入门到精通(10)PyTorch张量简介

这部分是 PyTorch介绍——YouTube系列的内容&#xff0c;每一节都对应一个youtube视频。&#xff08;可能跟之前的有一定的重复&#xff09; 创建张量随机张量和种子张量形状张量数据类型 使用PyTorch张量进行数学与逻辑运算简单介绍——张量广播关于张量更多的数学操作原地修改…...

Springboot 集成 Flowable 6.8.0

1. 创建 Spring Boot 项目 通过 Spring Initializr&#xff08;https://start.spring.io/ &#xff09;创建一个基础的 Spring Boot 项目&#xff0c;添加以下依赖&#xff1a; Spring WebSpring Data JPAMySQL DriverLombok&#xff08;可选&#xff0c;用于简化代码&#x…...

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档&#xff08;带图片&#xff09;预览&#xff0c;并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档&#xff08;带图片&#xff09;&#xff0c;预览、导出安装插件docx 模板文件内容完整代码…...

实验一、Linux环境下实现进度条小程序:深入解析核心实现与关键技术细节

目录 引言&#xff1a;为什么需要进度条&#xff1f;环境准备与项目结构分析原理剖析&#xff1a;从终端输出到动态刷新代码逐行解析&#xff08;附完整代码&#xff09; 4.1 头文件与宏定义4.2 进度条的动态构建逻辑4.3 关键转义字符&#xff1a;\r与\n的深度对比4.4 缓冲机制…...

生活电子常识——cmd不能使用anaconda的python环境,导致输入python打开应用商店

前言 电脑已经安装了anaconda,从自带的Anaconda Prompt (Anaconda3)中是可以识别python环境的&#xff0c;然而切换到cmd时&#xff0c;突然发现cmd中无法识别anaconda的python环境&#xff0c;竟然打开了应用商店让我安装Python&#xff0c;这当然是不对的。 解决 这是因为…...

TypeScript中的声明合并:与JavaScript的对比与实践指南

引言 在大型项目开发中&#xff0c;代码的可维护性和可扩展性至关重要。TypeScript作为JavaScript的超集&#xff0c;通过静态类型系统带来了更强大的代码组织能力。其中声明合并&#xff08;Declaration Merging&#xff09; 是TypeScript独有的重要特性&#xff0c;本文将深…...

数据结构初阶-二叉树链式

目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…...

2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现&#xff1a; 人的大脑结构非常复杂&#xff0c;内部交织密布着神经和血管&#xff0c;所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术&#xff0c;通常需要…...

Linux程序性能分析

为什么程序会慢&#xff1f; 在深入工具和方法之前&#xff0c;我们先来聊聊为什么程序会慢。一个程序主要在三个方面消耗资源&#xff1a; CPU时间 - 计算太多、算法效率低 内存使用 - 内存泄漏、频繁申请释放内存 I/O操作 - 文件读写、网络通信太频繁 今天我们主要聚焦C…...

【开题报告+论文+源码】基于SpringBoot的智能安全与急救知识科普系统设计与实现

项目背景与意义 在全球范围内&#xff0c;安全与急救知识的普及已成为提升公众安全素养、减少意外伤害发生率、提高突发事件应对能力的重要举措。尤其是在当今社会&#xff0c;人们面临的生活、工作环境日益复杂&#xff0c;交通事故、火灾、溺水、突发疾病等各种意外事件的发生…...

Linux shift 命令使用详解

简介 在 Bash 脚本中&#xff0c;shift 命令用于将命令行参数向左移动&#xff0c;有效地丢弃第一个参数并将其他参数向下移动。 基础语法 shift [N]N&#xff08;可选&#xff09;→ 要移动的位置数。默认值为 1 示例用法 移动参数 #!/bin/bash echo "Before shift…...

【C++网络编程】第5篇:UDP与广播通信

一、UDP协议核心特性 1. UDP vs TCP ​特性 ​UDP​TCP连接方式无连接面向连接&#xff08;三次握手&#xff09;可靠性不保证数据到达或顺序可靠传输&#xff08;超时重传、顺序控制&#xff09;传输效率低延迟&#xff0c;高吞吐相对较低&#xff08;因握手和确认机制&…...

C++11QT复习 (五)

文章目录 **Day6-2 成员访问运算符重载&#xff08;2025.03.25&#xff09;****1. 复习****2. 成员访问运算符重载****2.1 箭头运算符 (->) 重载****(1) 语法** **2.2 解引用运算符 (*) 重载****(1) 语法** **3. 代码分析****3.1 代码结构****3.2 代码解析****(1) Data 类**…...

Python项目-基于Python的网络爬虫与数据可视化系统

1. 项目简介 在当今数据驱动的时代&#xff0c;网络爬虫和数据可视化已成为获取、分析和展示信息的重要工具。本文将详细介绍如何使用Python构建一个完整的网络爬虫与数据可视化系统&#xff0c;该系统能够自动从互联网收集数据&#xff0c;进行处理分析&#xff0c;并通过直观…...

SpringCloud Zuul 使用教程

SpringCloud Zuul 使用教程 目录 Zuul 简介环境准备搭建 Zuul 网关 • 3.1 Maven 依赖 • 3.2 配置文件 • 3.3 启动类注解基本路由配置 • 4.1 简单路由 • 4.2 基于路径的路由 • 4.3 基于服务的路由Zuul 高级配置 • 5.1 过滤器配置 • 5.2 限流与熔断 • 5.3 负载均衡 •…...

介绍一款基于MinerU的PDF翻译工具

一。简介 Fast pdf translate是一款pdf翻译软件&#xff0c;基于MinerU实现pdf转markdown的功能&#xff0c;接着对markdown进行分割&#xff0c; 送给大模型翻译&#xff0c;最后组装翻译结果并由pypandoc生成结果pdf。 git地址&#xff1a; https://github.com/kv1830/fast…...

轻量级TLS反向代理工具TLS-reverse-proxy:打造安全通信桥梁

在数字化浪潮席卷全球的今天&#xff0c;数据隐私与传输安全已成为企业及个人的核心关切。TLS&#xff08;传输层安全协议&#xff09;作为互联网通信的"隐形卫士"&#xff0c;承担着保护数据在传输过程中不被窃取或篡改的重要使命。然而&#xff0c;对于许多传统服务…...

SQL问题分析与诊断(8)——前提

8.1. 前提 与其他关系库类似&#xff0c;SQL Server中&#xff0c;当我们对存在性能问题的SQL语句进行分析和诊断时&#xff0c;除了获取该SQL语句本身外&#xff0c;还需要获取SQL语句相应的查询计划及其相关的数据环境。这里&#xff0c;所谓数据环境&#xff0c;具体是指SQ…...

关于cmd中出现无法识别某某指令的问题

今天来解决以下这个比较常见的问题&#xff0c;安装各种软件都可能会发生&#xff0c;一般是安装时没勾选注册环境变量&#xff0c;导致cmd无法识别该指令。例如mysql&#xff0c;git等&#xff0c;一般初学者可能不太清楚。 解决这类问题最主要的是了解环境变量的概念&#x…...

如何处理不同输入类型(例如邮箱、电话号码)的验证?

处理不同输入类型(如邮箱、电话号码)的验证可以通过多种方法实现,包括使用 HTML5 内置验证、JavaScript/jQuery 自定义验证和正则表达式。以下是一些常用的验证方法和示例。 1. 使用 HTML5 内置验证 HTML5 提供了一些内置的输入类型,可以自动处理基本的验证。 示例 <…...

Redis集群哨兵相关面试题

目录 1.Redis 主从复制的实现原理是什么? 详解 补充增量同步 replication buffer repl backlog buffer 2.Redis 主从复制的常见拓扑结构有哪些? 3.Redis 复制延迟的常见原因有哪些? 4.Redis 的哨兵机制是什么? 主观下线和客观下线 哨兵leader如何选出来的&#x…...

【CXX-Qt】4.1 extern “RustQt“

QObjects Properties Methods Signals #[cxx_qt::bridge] mod ffi {extern "RustQt" {} }extern “RustQt” 部分是 CXX-Qt 桥接的核心&#xff0c;用于声明 Rust 类型和签名&#xff0c;使其可用于 Qt 和 C。 CXX-Qt 代码生成器使用你的 extern “RustQt” 部…...

当 0 编程基础,用 ChatGPT 和 Cursor 开发同一应用时… |AI 开发初体验

求人不如求己。 事情是这样的&#xff0c;前段时间&#xff0c;我看了本书&#xff0c;书里介绍了款应用&#xff0c;能计算财富自由价格&#xff0c;还能制定退休计划。 结果&#xff0c;我迫不及待去下载这个应用时&#xff0c;发现这应用功能残缺&#xff0c;完全不可用。 …...

如何排查C++程序的CPU占用过高的问题

文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…...

数据库练习

完善t_hero表 -- 添加作者字段 alter table t_hero add author varchar(100);-- 更新数据update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id…...

nodejs-原型污染链

还是老规矩&#xff0c;边写边学&#xff0c;先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…...

无人机与AI技术结合的突破性应用场景

1. 自主导航与动态避障 技术栈&#xff1a;SLAM 强化学习 (PPO算法) 代码示例&#xff08;Python PyTorch&#xff09;&#xff1a; import torch class DronePPO(torch.nn.Module):def __init__(self):super().__init__()self.actor torch.nn.Sequential(torch.nn.Linear…...

jsBridge在vue中使用

创建jsBridge.js /* eslint-disable */ function connectWebViewJavascriptBridge (callback) {if (window.WebViewJavascriptBridge) {callback(window.WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady, function () { callback(wi…...

Windows下docker使用教程

docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的&#xff0c;后面的内容其实不变 …...

iOS:GCD信号量、同步、异步的使用方法

信号量的详细用法&#xff0c;可以用此方法进行队列管理 -(void)dispatchSignal{//crate的value表示&#xff0c;最多几个资源可访问dispatch_semaphore_t semaphore dispatch_semaphore_create(3);dispatch_queue_t quene dispatch_get_global_queue(DISPATCH_QUEUE_PRIORI…...

Nginx相关漏洞解析

一、CRLF注入漏洞 原理&#xff1a;Nginx将传入的url进行解码&#xff0c;对其中的%0a%0d替换成换行符&#xff0c;导致后面的数据注入至头部&#xff0c;造成CRLF 注入漏洞 1、开环境 2、访问网站&#xff0c;并抓包 3、构造请求头 %0ASet-cookie:JSPSESSID%3D1 这样就可以…...

SpringCloud构建一个服务步骤

Spring Cloud是一个用于构建分布式系统的开源框架&#xff0c;可以帮助开发者快速构建各种云原生应用。下面是一个简单的步骤&#xff0c;展示如何使用Spring Cloud构建一个服务&#xff1a; 创建一个Spring Boot项目&#xff1a;首先需要创建一个Spring Boot项目作为基础。可以…...

MySQL中怎么分析性能?

MySQL中主要有4种方式可以分析数据库性能&#xff0c;分别是慢查询日志&#xff0c;profile&#xff0c;Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启&#xff0c; show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…...

MinGW与使用VScode写C语言适配

压缩包 通过网盘分享的文件&#xff1a;MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面&#xff0c;从上数第4个&#xff0c;点击扩展&#xff08;以下通此&#xff09; 搜索---Chinese--点击---安装--o…...

k8s存储介绍(五)PV与PVC

在 Kubernetes&#xff08;k8s&#xff09;中&#xff0c;持久化存储&#xff08;Persistent Storage&#xff09;是一个非常重要的概念&#xff0c;因为 Pod 本身是无状态的&#xff0c;重启后会丢失数据。为了支持有状态应用&#xff0c;Kubernetes 提供了持久化存储的机制&a…...

LangChain开发(五)消息管理与聊天历史存储

文章目录 消息存储在内存使用单参数session_id配置会话唯一键 消息持久化到redis安装redis依赖安装redis调用聊天接口&#xff0c;看Redis是否存储历史记录 裁剪消息总结记忆源码地址参考资料 消息存储在内存 我们展示一个简单的示例&#xff0c;其中聊天历史保存在内存中&…...

HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)

引言 在前端开发的广袤领域中&#xff0c;HTML 表单处理堪称基石般的存在&#xff0c;是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单&#xff0c;到功能多样的搜索栏、反馈表单&#xff0c;HTML 表单如同桥梁&#xff0c;紧密连接着用户与 Web 应用…...

【文献25/03/26】Hyperspectral Image Transformer Classification Networks

高光谱图像Transformer分类网络 Hyperspectral Image Transformer Classification Networks | IEEE Journals & Magazine | IEEE Xplore 摘要 高光谱图像&#xff08;HSI&#xff09;分类是地球观测任务中的一项重要工作。 卷积神经网络&#xff08;CNN&#xff09;凭借…...

数字转换(c++)

【题目描述】 如果一个数 xx 的约数和 yy &#xff08;不包括他本身&#xff09;比他本身小&#xff0c;那么 xx 可以变成 yy &#xff0c;yy 也可以变成 xx 。例如 44 可以变为 33 &#xff0c;11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行&#xff0c;…...

WPF ContentPresenter详解2

ContentPresenter与ContentControl的区别 ContentControl 和 ContentPresenter 是 WPF 中两个相关的控件&#xff0c;但它们在用途和功能上有一些关键的区别。理解这两者的区别和联系有助于更好地设计和开发用户界面。 1. 类层次结构 ContentControl&#xff1a;位于 WPF 控件…...

【git】认识git的本地仓库

1.创建本地仓库 git init2. 配置本地仓库 git config user.name xxx git config user.email xxx3. 认识本地仓库 创建完本地仓库后&#xff0c;目录下会有一个.git文件&#xff0c;这个就是本地仓库 而创建本地仓库的目录叫做工作区&#xff0c;我们不能对.git文件进行任何手…...

正则表达式基本语法和Java中的简单使用

先来个例子 public static final Pattern CHINESE_PATTERN Pattern.compile("[\\u4e00-\\u9fa5]"); / 检测字符串是否包含汉字 String text "Hello 世界"; boolean hasChinese CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字 Mat…...

【大模型】什么是循环神经网络(RNNs)

在人工智能&#xff08;AI&#xff09;的世界里&#xff0c;**循环神经网络&#xff08;Recurrent Neural Networks, RNNs&#xff09;**是一种非常强大的工具&#xff0c;特别适合处理序列数据。无论是语言、时间序列还是音乐&#xff0c;RNNs都能帮助我们理解和预测这些数据的…...