Apache Calcite - 查询优化之自定义优化规则
RelOptRule简介
为了自定义优化规则,我们需要继承RelOptRule类。org.apache.calcite.plan.RelOptRule 是 Apache Calcite 中的一个抽象类,用于定义优化规则。优化规则是用于匹配查询计划中的特定模式,并将其转换为更优化的形式的逻辑。通过继承 RelOptRule,你可以创建自定义的优化规则,以满足特定的优化需求。
RelOptRule 的主要作用包括:
- 定义匹配模式:通过构造函数中的 RelOptRuleOperand,定义规则所匹配的关系表达式树的模式。
- 实现匹配逻辑:通过实现 onMatch 方法,定义当匹配模式被识别时,如何转换关系表达式树。
- 管理规则应用:RelOptRule 还负责管理规则的应用,包括检查规则是否适用以及如何应用规则。
一个常见的自定义规则实现如下:
class CustomFilterProjectTransposeRule extends RelOptRule {protected CustomFilterProjectTransposeRule(RelOptRuleOperand operand) {// 定义匹配模式super(operand);}@Overridepublic void onMatch(RelOptRuleCall call) {// 触发匹配后,执行优化动作}}
RelOptRule 的关键组成部分
1. 构造函数
RelOptRule 的构造函数用于定义规则的匹配模式。匹配模式是通过 RelOptRuleOperand 来描述的,RelOptRuleOperand 定义了规则所匹配的关系表达式树的结构。
RelOptRule(RelOptRuleOperand operand, String description)
- operand:描述优化规则匹配模式的一个关键类。它定义了规则所匹配的关系表达式树的结构,并且在 RelOptRule 中被用来指定规则的匹配条件。
- description:规则的描述信息,通常用于调试和日志记录。
RelOptRuleOperand 的主要作用包括:
- 描述匹配模式:通过指定关系表达式的类型和层次结构,描述优化规则所匹配的模式。
- 支持递归匹配:允许定义嵌套的匹配模式,从而支持复杂的关系表达式树的匹配。
- 配置匹配条件:可以通过各种配置选项来精确控制匹配行为,例如是否匹配子节点、是否匹配某些特定属性等。
2. onMatch 方法
onMatch 方法是一个抽象方法,必须在子类中实现。当规则匹配时,onMatch 方法会被调用,以执行具体的转换逻辑。
public abstract void onMatch(RelOptRuleCall call);
- call:RelOptRuleCall 对象,包含了匹配的关系表达式节点,并提供了一些方法来转换这些节点。
RelOptRuleOperand
RelOptRuleOperand 是用于描述规则匹配模式的类。它定义了规则所匹配的关系表达式树的结构。
构造函数如下
<R extends RelNode> RelOptRuleOperand(Class<R> clazz,@Nullable RelTrait trait,Predicate<? super R> predicate,RelOptRuleOperandChildPolicy childPolicy,ImmutableList<RelOptRuleOperand> children)
- Class clazz: 这是一个泛型参数,指定了匹配的关系表达式节点的类型。例如,Filter.class 或 Project.class。R 是继承自 RelNode 的类型。
- @Nullable RelTrait trait: 这是一个可选参数,指定了匹配节点的特性(trait)。特性可以用来描述节点的一些额外属性,例如排序、分区等。
如果不需要特定的特性,可以传入 null。 - Predicate<? super R> predicate: 这是一个谓词,用于进一步限制匹配的节点。只有当节点满足这个谓词时,才会匹配成功。例如,你可以使用谓词来检查节点的某些属性或状态。
- RelOptRuleOperandChildPolicy childPolicy: 这是一个枚举类型,指定了子节点的匹配策略。常见的策略包括:
- ANY:匹配任意数量的子节点。
- SOME:匹配至少一个子节点。
- LEAF:匹配没有子节点的节点。
- UNORDERED:匹配子节点的顺序不重要。这个参数用于控制匹配模式中子节点的数量和顺序。
- ImmutableList children:这是一个不可变列表,包含了子节点的匹配模式。每个子节点的匹配模式也是一个 RelOptRuleOperand 实例。通过嵌套定义,可以描述复杂的关系表达式树的匹配模式。
实际创建RelOptRuleOperand我们通过工厂方法来完成,这个工厂方法的主要功能是创建一个 RelOptRuleOperand 实例。它通过调用 RelOptRuleOperand 的构造函数,传递必要的参数来初始化匹配模式。
public static <R extends RelNode> RelOptRuleOperand operand(Class<R> clazz,RelOptRuleOperand first,RelOptRuleOperand... rest) {return operand(clazz, some(first, rest));}
- Class clazz: 这是一个泛型参数,指定了匹配的关系表达式节点的类型。例如,Filter.class 或 Project.class。R 是继承自 RelNode 的类型。
- RelOptRuleOperand first:这是第一个子节点的匹配模式,类型为 RelOptRuleOperand。
- RelOptRuleOperand… rest: 这是一个可变参数,表示零个或多个额外的子节点的匹配模式,类型为 RelOptRuleOperand。
这里的节点均是指关系表达式树种的节点。
RelOptRuleCall
类是优化规则(RelOptRule)应用过程中非常关键的一个类。它用于表示在优化过程中某个规则的匹配和应用状态,并提供了相关方法来处理匹配到的关系表达式(RelNode)树。
方法
- transformTo(RelNode rel):这个方法用于将变换后的关系表达式节点提交给优化器。参数 rel 是变换后的关系表达式节点。
调用这个方法后,优化器会将新的节点纳入进一步的优化过程中。 - getPlanner():返回当前的优化器实例(RelOptPlanner)。
- getRule():返回当前正在应用的优化规则(RelOptRule)。
- rel(int ordinal): 返回匹配到的关系表达式节点。参数 ordinal 是节点在匹配模式中的位置索引。
- getChild(int ordinal):返回匹配到的关系表达式节点的子节点。参数 ordinal 是子节点在匹配模式中的位置索引。
rel(int ordinal)方法 ordinal参数:
假设我们定义了一个匹配模式,用于匹配一个 Filter 节点,其子节点是一个 Project 节点,而 Project 节点的子节点是一个 TableScan 节点。这个匹配模式可以通过以下方式定义:
- Filter 节点的位置索引为 0。
- Project 节点的位置索引为 1。
- TableScan 节点的位置索引为 2。
这些索引是根据匹配模式中节点的定义顺序确定的。
节点的输入(inputs)
通常指的是这个节点的子节点。在关系表达式树中,每个节点都可以有一个或多个输入节点,这些输入节点就是它的子节点。输入节点的结构和关系决定了整个关系表达式树的结构。
在关系表达式树中,每个节点代表一个关系操作(如筛选、投影、连接等),而这些节点通过输入节点(子节点)连接在一起,形成一个树形结构。根节点表示最终的查询结果,而叶节点通常表示数据源(如表扫描)。
输入节点(子节点)是关系表达式树中每个节点的直接子节点。它们定义了当前节点的操作对象。例如:
- Filter 节点:其输入节点是需要过滤的数据源,可以是一个表扫描节点(TableScan)或另一个操作节点(如投影节点)。
- Project 节点:其输入节点是需要投影的数据源,可以是一个表扫描节点或另一个操作节点(如过滤节点)。
- Join 节点:其输入节点是需要进行连接的两个数据源,可以是表扫描节点或其他操作节点。
一个自定义优化规则的例子
输入sql
SELECT name, age
FROM (SELECT name, age, salaryFROM employees
) AS subquery
WHERE age > 30
我们生成对应的关系表达式树
LogicalProject(department=[$1])LogicalFilter(condition=[>($0, 10)])LogicalProject(id=[$0], department=[$1])LogicalTableScan(table=[[MY_SCHEMA, department_table]])
自定义优化规则,自定义规则的作用就是将过滤下推到投影之前。最终调用transform方法
将整个匹配到的子树(即 Filter 节点及其子节点 Project)替换为新的子树(即 newProject 节点及其子节点)。
public class CustomFilterProjectTransposeRule extends RelOptRule {int invoke = 0;private CustomFilterProjectTransposeRule() {super(operand(Filter.class, operand(Project.class, any())), "CustomFilterProjectTransposeRule");// 定义子节点的匹配模式}@Overridepublic void onMatch(RelOptRuleCall call) {// 获取匹配的 Filter 和 Project 节点final Filter filter = call.rel(0);final Project project = call.rel(1);// 创建一个新的 Project 节点,其子节点为原 Project 节点的输入final RelNode newFilter = filter.copy(filter.getTraitSet(), Lists.newArrayList(project.getInput()));// 创建一个新的 Filter 节点,其输入为新的 Project 节点final RelNode newProject = project.copy(project.getTraitSet(), Lists.newArrayList(newFilter));// 将新生成的节点替换原来的节点call.transformTo(newProject);}}
输出的关系表达式树为
优化前:
LogicalProject(id=[$0], department=[$1])LogicalFilter(condition=[>($0, 10)])LogicalProject(id=[$0], department=[$1])LogicalTableScan(table=[[MY_SCHEMA, department_table]])优化后:
LogicalProject(id=[$0], department=[$1])LogicalProject(id=[$0], department=[$1])LogicalFilter(condition=[>($0, 10)])LogicalTableScan(table=[[MY_SCHEMA, department_table]])
优化后的SQL:
SELECT "id", "department"
FROM "MY_SCHEMA"."department_table"
WHERE "id" > 10
完整代码
package calcite.optimization;/*** @author xxx*/import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import org.apache.calcite.config.Lex;
import org.apache.calcite.jdbc.CalciteConnection;
import org.apache.calcite.plan.RelOptRule;
import org.apache.calcite.plan.RelOptRuleCall;
import org.apache.calcite.plan.hep.HepPlanner;
import org.apache.calcite.plan.hep.HepProgram;
import org.apache.calcite.plan.hep.HepProgramBuilder;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.RelRoot;
import org.apache.calcite.rel.core.Filter;
import org.apache.calcite.rel.core.Project;
import org.apache.calcite.rel.rel2sql.RelToSqlConverter;
import org.apache.calcite.rel.rel2sql.SqlImplementor.Result;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.schema.Schema;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.schema.Table;
import org.apache.calcite.schema.impl.AbstractSchema;
import org.apache.calcite.schema.impl.AbstractTable;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.dialect.MysqlSqlDialect;
import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.sql.pretty.SqlPrettyWriter;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
import org.apache.calcite.tools.FrameworkConfig;
import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.tools.Planner;
import org.assertj.core.util.Lists;
import org.junit.Test;/*** 自定义规则优化SQL演示* @ClassName SqlToRelNode* @Author xxx* @Date 2024/10/15 20:20**/
public class OptFromCustomRule {public class CustomFilterProjectTransposeRule extends RelOptRule {private CustomFilterProjectTransposeRule() {super(operand(Filter.class, operand(Project.class, any())), "CustomFilterProjectTransposeRule");// 定义子节点的匹配模式}@Overridepublic void onMatch(RelOptRuleCall call) {// 获取匹配的 Filter 和 Project 节点final Filter filter = call.rel(0);final Project project = call.rel(1);// 创建一个新的 Project 节点,其子节点为原 Project 节点的输入final RelNode newFilter = filter.copy(filter.getTraitSet(), Lists.newArrayList(project.getInput()));// 创建一个新的 Filter 节点,其输入为新的 Project 节点final RelNode newProject = project.copy(project.getTraitSet(), Lists.newArrayList(newFilter));// 将新生成的节点替换原来的节点call.transformTo(newProject);}}/*** 创建配置的时候应该建什么配置* Sql转关系代数表达式*/@Testpublic void testSqlToRelNode() throws Exception{// 1. 设置内存数据库连接Properties info = new Properties();Connection connection = DriverManager.getConnection("jdbc:calcite:", info);CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);// 2. 创建自定义SchemaSchemaPlus rootSchema = calciteConnection.getRootSchema();Schema schema = new AbstractSchema() {};rootSchema.add("MY_SCHEMA", schema);// 3. 添加表到自定义SchemaTable yourTable = new AbstractTable() {@Overridepublic RelDataType getRowType(RelDataTypeFactory typeFactory) {// 如果要动态分析表,那么就自己去创建return typeFactory.builder().add("id", typeFactory.createJavaType(int.class)).add("name", typeFactory.createJavaType(String.class)).add("age", typeFactory.createJavaType(int.class)).build();}};// 3. 添加表到自定义SchemaTable department_table = new AbstractTable() {@Overridepublic RelDataType getRowType(RelDataTypeFactory typeFactory) {// 如果要动态分析表,那么就自己去创建return typeFactory.builder().add("id", typeFactory.createJavaType(int.class)).add("department", typeFactory.createJavaType(String.class)).add("location", typeFactory.createJavaType(String.class)).build();}};rootSchema.getSubSchema("MY_SCHEMA").add("your_table", yourTable);rootSchema.getSubSchema("MY_SCHEMA").add("department_table", department_table);// 4. 配置SQL解析器SqlParser.Config parserConfig = SqlParser.config().withLex(Lex.MYSQL).withConformance(SqlConformanceEnum.MYSQL_5);// 5. 配置框架FrameworkConfig config = Frameworks.newConfigBuilder().parserConfig(parserConfig).defaultSchema(rootSchema.getSubSchema("MY_SCHEMA")) // 使用自定义Schema.build();// 6. 创建Planner实例Planner planner = Frameworks.getPlanner(config);// 7. 解析SQLString sql = "SELECT id,department FROM (SELECT id, department FROM department_table) as d WHERE id > 10 ";
// String sql = "SELECT * FROM your_table where id = 1 and name = 'you_name'";SqlNode sqlNode = planner.parse(sql);// 8. 验证SQLSqlNode validatedSqlNode = planner.validate(sqlNode);// 9. 转换为关系表达式RelRoot relRoot = planner.rel(validatedSqlNode);// 10. 获取RelNodeRelNode rootRelNode = relRoot.rel;// 打印RelNode的信息System.out.println(rootRelNode.explain());// 创建HepProgramHepProgram hepProgram = new HepProgramBuilder().addRuleInstance(new CustomFilterProjectTransposeRule()).build();// 创建HepPlannerHepPlanner hepPlanner = new HepPlanner(hepProgram);// 设置根RelNodehepPlanner.setRoot(rootRelNode);// 进行优化RelNode optimizedRelNode = hepPlanner.findBestExp();// 输出优化后的RelNodeSystem.out.println("优化后的RelNode: \n" + optimizedRelNode.explain());// 10. 使用RelToSqlConverter将优化后的RelNode转换回SQLRelToSqlConverter relToSqlConverter = new RelToSqlConverter(MysqlSqlDialect.DEFAULT);Result result = relToSqlConverter.visitRoot(optimizedRelNode);SqlNode sqlNodeConverted = result.asStatement();// 11. 使用SqlPrettyWriter格式化SQLSqlPrettyWriter writer = new SqlPrettyWriter();String convertedSql = writer.format(sqlNodeConverted);// 输出转换后的SQLSystem.out.println("优化后的SQL: " + convertedSql);// 关闭连接connection.close();}
}
总结
自定义优化规则需要定义好匹配模式来匹配关系表达式树种个某一个部分,最终应用转换规则调整关系表达式树种子树的位置。
- 定义匹配模式:在自定义优化规则中,需要定义一个匹配模式,用于匹配关系表达式树中的特定部分。匹配模式通常是通过定义操作数(operand)来实现的,这些操作数指定了需要匹配的关系表达式节点及其层次结构。
- 匹配关系表达式树:优化器会使用定义的匹配模式在关系表达式树中查找符合条件的子树。当找到匹配的子树时,优化器会触发相应的优化规则。
- 应用转换规则:在匹配到关系表达式树的特定部分后,优化规则会应用转换逻辑。转换逻辑通常涉及创建新的关系表达式节点,并调整这些节点的位置或结构,以实现优化目的。
调整关系表达式树:
最终,应用转换规则会调整关系表达式树中的子树位置。这可能包括将某些节点下推、上拉、合并或分解等操作,从而优化查询计划,提高查询执行效率。
相关文章:
Apache Calcite - 查询优化之自定义优化规则
RelOptRule简介 为了自定义优化规则,我们需要继承RelOptRule类。org.apache.calcite.plan.RelOptRule 是 Apache Calcite 中的一个抽象类,用于定义优化规则。优化规则是用于匹配查询计划中的特定模式,并将其转换为更优化的形式的逻辑。通过继…...
大型语言模型(LLM)的小型化研究进展
2024年,大型语言模型(LLM)的小型化研究取得了显著进展,主要采用以下几种方法实现: 模型融合:通过将多个模型或检查点合并为一个单一模型,减少资源消耗并提升整体性能。例如,《WARM: …...

MiniWord
1.nuget 下载配置 2.引用 3. var value = new Dictionary<string, object>() { ["nianfen"] = nianfen, ["yuefen"] = yuefen, ["yuefenjian1"] = (int.Par…...

Netty 常见组件介绍
Netty 常见组件介绍 上篇文章Netty入门程序echo 基本包含了Netty常见的组件,本文分别介绍各个组件 Bootstrap or ServerBootstrapEventLoopEventLoopGroupChannelPipelineChannelFuture or ChannelFutureChannelInitializerChannelHandler Bootstrap vs ServerBo…...

高频电子线路---倍频器与振荡器
目录 倍频电路原理 丙类倍频器原理电路 问题: 提升滤波方法: 导通角 振荡器 振荡器基本工作原理 首先是怎么维持 那么如何振荡呢? 思考题: 组成要素 振荡器的起振条件 平衡条件 要点提示 稳定条件 振幅平衡 硬激励起振时: 稳定条件 相位平衡 倍频电路原理 简单原理 : …...
删除 git submodule
直接运行下面命令即可: git rm <path-to-submodule>然后提交修改即可。 但是,还有一个小问题:上面命令只是将 submodule 的代码目录删除了。 以下痕迹还存在你的仓库中: .gitmodule 中关于该 submodule 的信息.git 目录…...
el-table 多选默认选中(根据返回的id给数据加默认选中状态)
前言 el-table是我们最常用的展示数据的方式,但是有时候需要用到多选来选择数据,新增数据的时候还好,选中状态都是正常的,但是修改就遇到问题,需要对这个已经选择过的数据加上默认的选中状态,本次就是解决…...
境外网站翻译之自由职业
Polls Do you use AI tools (e.g ChatGPT, Midjourney, Github Copilot) as part of your work? 你在工作中会使用人工智能工具(如 ChatGPT、Midjourney、Github Copilot)吗? Yes, as an assistant 是的,作为一种辅助工具。 Y…...
批量图片转PDF文件的多种方法详解
要将批量图片转换为PDF文件,可以使用多种方法,包括使用在线工具、桌面应用程序或编程语言。以下是几种常见的方法: 方法一:使用在线工具 选择工具:搜索“图片转PDF”在线工具,如 Smallpdf、ILovePDF 等。…...

Web服务器(理论)
目录 Web服务器www简介常见Web服务程序介绍:服务器主机主要数据浏览器 网址及HTTP简介URLhttp请求方法:2.3 HTTP协议请求的工作流程: www服务器的类型静态网站动态网站 快速安装Apache安装准备工作httpd所需目录主配置文件 nignx安装1、安装2、准备工作 …...
js:()=>(,);()的作用:明确表达式的边界。
()>{表达式1;表达式2;表达式3;... return 结果} 等同于 ()>(表达式1,表达式2,表达式3,... 结果) 例子: const strarr [a, b, c];const result strarr.reduce((acc, curr) > {(acc[curr] 1);console.lo…...
RSI 5G通信技术中用于标识小区的特定参数
RSI是指在5G通信技术中用于标识小区的特定参数,全称为Radio Subframe Indicator(无线子帧指示符)。在原文的上下文中,RSI被用来确保相邻小区间有足够的间隔,避免由于RSI冲突导致用户设备(UE)随机…...
JavaScript中的闭包、递归问题
一、函数定义和调用 1.函数的定义方式 方式一 函数声明方式 function 关键字(命名函数) function fn(){}方式二 函数表达式(匿名函数) var fn function(){}方式三 new Function() var f new Function(a,b,console.log(a b););//语法 var fn new Fu…...

【青牛科技】GC4938替代A4938/Allegro在水泵、筋膜枪、吸尘器和电动工具中的应用
随着技术的不断进步,电机驱动控制器在各类电动设备中的应用越来越广泛。GC4938作为一种新型的电机驱动控制器,逐渐被视为A4938/Allegro的替代品。在这篇文章中,我们将探讨GC4938在水泵、筋膜枪、吸尘器和电动工具等设备中的应用优势和特点。 …...

基于yolov5的输电线,电缆检测系统,支持图像检测,视频检测和实时摄像检测功能(pytorch框架,python源码)
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: yolov5,输电线(线缆)检测系统,系统既支持图像检测,也支持视频和摄像实时检测【pytorch框架】_哔哩哔哩_bilibili (一)简介 基于yolov5的输…...

uniapp下载文件的方案,包括H5,App方案解决办法
1. 在uniapp需要下载文件,但是显示情况是不能下载。所以只能使用该办法来进行下载。 2. 这有一个注意点是:如果你做的是H5的方案,那么我已经替你踩好坑了,UC浏览器是不支持blob类型的下载,以及创建a标签的方案来进行下…...
c++ 贪心算法
概念 贪心算法是一种在每一步选择中都选择当前最优解的算法策略。这种方法适用于某些特定问题,可以通过局部最优选择构建全局最优解。 特点 局部最优选择:每一步选择都选择当前看起来最优的解。无后效性:当前选择不会影响未来选择的可能性…...
15分钟学 Go 第 35 天:Go的性能调优 (7000字详细教程)
第35天:Go的性能调优 目标:理解Go语言中基本的性能优化,学习如何分析和提高Go程序的执行效率。 一、性能调优概述 性能调优是软件开发中的一个重要环节,它可以确保程序在资源有限的环境下高效运行。Go语言天生具备高效的性能表现…...
6、显卡品牌分类介绍:技嘉 - 计算机硬件品牌系列文章
技嘉科技是一家以主板、显卡在业界缔造无以撼动的地位的科技公司,其核心理念是「技术创新、质量稳定」的高标准。技嘉专注于关键技术研发,其经营范围涵盖家用、商用、电竞等多元科技领域。通过应用突破性的专利技术,技…...

Redis数据类型——针对实习面试
目录 Redis数据类型Redis常用的数据类型有哪些?String类型可以用于哪些场景?Set类型可以用于哪些场景?Bitmaps类型可以用于哪些场景?HyperLogLog类型可以用于哪些场景?Hash类型与Set类型有什么区别?Hash类型…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...