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

《ShardingSphere解读》15 路由引擎:如何在路由过程中集成多种路由策略和路由算法?

上一篇中我们在介绍 ShardingRule 对象时引出了 ShardingSphere 路由引擎中的分片策略 ShardingStrategy分片策略是路由引擎中的一个核心概念直接影响了最终的路由结果。今天我们将围绕这一核心概念展开讨论。分片策略整体结构我们先来看分片策略 ShardingStrategy 的定义ShardingStrategy 位于 sharding-core-common 工程的 org.apache.shardingsphere.core.strategy.route 包中其定义如下所示public interface ShardingStrategy { //获取分片 Column Collection getShardingColumns(); //执行分片 Collection doSharding(Collection availableTargetNames, Collection shardingValues); }可以看到 ShardingStrategy 包含两个核心方法一个用于指定分片的 Column而另一个负责执行分片并返回目标 DataSource 和 Table。ShardingSphere 中为我们提供了一系列的分片策略实例类层结构如下所示ShardingStrategy 实现类图如果我们翻阅这些具体 ShardingStrategy 实现类的代码会发现每个 ShardingStrategy 中都会包含另一个与路由相关的核心概念即分片算法 ShardingAlgorithm我们发现 ShardingAlgorithm 是一个空接口但包含了四个继承接口即PreciseShardingAlgorithmRangeShardingAlgorithmComplexKeysShardingAlgorithmHintShardingAlgorithm而这四个接口又分别具有一批实现类ShardingAlgorithm 的类层结构如下所示ShardingAlgorithm 子接口和实现类图请注意ShardingStrategy 与 ShardingAlgorithm 之间并不是一对一的关系。在一个 ShardingStrategy 中可以同时使用多个 ShardingAlgorithm 来完成具体的路由执行策略。因此我们具有如下所示的类层结构关系图由于分片算法的独立性ShardingSphere 将其进行单独抽离。从关系上讲分片策略中包含了分片算法和分片键我们可以把分片策略的组成结构简单抽象成如下所示的公式分片策略 分片算法 分片键ShardingSphere 分片策略详解在 ShardingSphere 中一共存在五种 ShardingStrategy 实现不分片策略NoneShardingStrategyHint 分片策略HintShardingStrategy标准分片策略StandardShardingStrategy复合分片策略ComplexShardingStrategy行表达式分片策略InlineShardingStrategy接下来我们就对这些 ShardingStrategy一 一进行展开讨论。1.不分片策略 NoneShardingStrategy这次我们从简单的开始先来看 NoneShardingStrategy这是一种不执行分片的策略实现方式如下所示public final class NoneShardingStrategy implements ShardingStrategy { private final Collection shardingColumns Collections.emptyList(); Override public Collection doSharding(final Collection availableTargetNames, final Collection shardingValues) { return availableTargetNames; } }可以看到在 NoneShardingStrategy 中直接返回了输入的 availableTargetNames 而不执行任何具体路由操作。2.Hint 分片策略 HintShardingStrategy接下来我们来看 HintShardingStrategy回想我们在上一篇中通过这个 ShardingStrategy 来判断是否根据 Hint 进行路由。我们知道在有些场景下分片字段不是由 SQL 本身决定而由依赖于其他外置条件这时候就可使用 SQL Hint 灵活地注入分片字段。关于 Hint 的概念和前置路由的应用方式可以回顾 [《07 | 数据分片如何实现分库、分表、分库分表以及强制路由下》]中的内容。基于 HintShardingStrategy我们可以通过 Hint 而非 SQL 解析的方式执行分片策略。而 HintShardingStrategy 的实现依赖于HintShardingAlgorithmHintShardingAlgorithm 继承了 ShardingAlgorithm 接口。其定义如下所示可以看到该接口同样存在一个 doSharding 方法public interface HintShardingAlgorithm extends ShardingAlgorithm { //根据 Hint 信息执行分片 Collection doSharding(Collection availableTargetNames, HintShardingValue shardingValue); }对于 Hint 而言因为它实际上是对 SQL 执行过程的一种直接干预所以往往根据传入的 availableTargetNames 进行直接路由所以我们来看 ShardingSphere 中 HintShardingAlgorithm 接口唯一的一个实现类 DefaultHintShardingAlgorithmpublic final class DefaultHintShardingAlgorithm implements HintShardingAlgorithm { Override public Collection doSharding(final Collection availableTargetNames, final HintShardingValue shardingValue) { return availableTargetNames; } }可以看到这个分片算法的执行方式确实是基于 availableTargetNames但只是直接返回而已。所以对于 HintShardingStrategy 而言默认情况下实际上并没有执行任何路由效果。HintShardingStrategy 的完整实现如下所示public final class HintShardingStrategy implements ShardingStrategy { Getter private final Collection shardingColumns; private final HintShardingAlgorithm shardingAlgorithm; public HintShardingStrategy(final HintShardingStrategyConfiguration hintShardingStrategyConfig) { Preconditions.checkNotNull(hintShardingStrategyConfig.getShardingAlgorithm(), Sharding algorithm cannot be null.); shardingColumns new TreeSet(String.CASE_INSENSITIVE_ORDER); //从配置中获取 HintShardingAlgorithm shardingAlgorithm hintShardingStrategyConfig.getShardingAlgorithm(); } SuppressWarnings(unchecked) Override public Collection doSharding(final Collection availableTargetNames, final Collection shardingValues) { ListRouteValue shardingValue (ListRouteValue) shardingValues.iterator().next(); Collection shardingResult shardingAlgorithm.doSharding(availableTargetNames, new HintShardingValue(shardingValue.getTableName(), shardingValue.getColumnName(), shardingValue.getValues())); Collection result new TreeSet(String.CASE_INSENSITIVE_ORDER); result.addAll(shardingResult); return result; } }我们注意到在 HintShardingStrategy 中shardingAlgorithm 变量的构建是通过 HintShardingStrategyConfiguration 配置类完成的显然我们可以通过配置项来设置具体的 HintShardingAlgorithm。在日常开发过程中我们一般都需要实现自定义的 HintShardingAlgorithm 并进行配置。[《07 | 数据分片如何实现分库、分表、分库分表以及强制路由下》]中演示了这种做法你可以做一些回顾。3.标准分片策略 StandardShardingStrategyStandardShardingStrategy 是一种标准分片策略提供对 SQL 语句中的, , , , , IN 和 BETWEEN AND 等操作的分片支持。我们知道分片策略相当于分片算法与分片键的组合。对于 StandardShardingStrategy 而言它只支持单分片键并提供PreciseShardingAlgorithm和RangeShardingAlgorithm这两个分片算法。PreciseShardingAlgorithm 是必选的用于处理 和 IN 的分片RangeShardingAlgorithm 是可选的用于处理 BETWEEN AND, , , , 分片。介绍 StandardShardingStrategy 之前我们先对其涉及的这两种分片算法分别进行讨论。1PreciseShardingAlgorithm对于 PreciseShardingAlgorithm 而言该接口用于处理使用单一键作为分片键的 和 IN 进行分片的场景。它有两个实现类分别是 PreciseModuloDatabaseShardingAlgorithm 和 PreciseModuloTableShardingAlgorithm。显然前者用于数据库级别的分片而后者面向表操作。它们的分片方法都一样就是使用取模Modulo操作。以 PreciseModuloDatabaseShardingAlgorithm 为例其实现如下所示public final class PreciseModuloDatabaseShardingAlgorithm implements PreciseShardingAlgorithm { Override public String doSharding(final Collection availableTargetNames, final PreciseShardingValue shardingValue) { for (String each : availableTargetNames) { //根据分片值执行对2的取模操作 if (each.endsWith(shardingValue.getValue() % 2 )) { return each; } } throw new UnsupportedOperationException(); } }可以看到这里对 PreciseShardingValue 进行了对 2 的取模计算并与传入的 availableTargetNames 进行比对从而决定目标数据库。2RangeShardingAlgorithm而对于 RangeShardingAlgorithm 而言情况就相对复杂。RangeShardingAlgorithm 同样具有两个实现类分别为 RangeModuloDatabaseShardingAlgorithm 和 RangeModuloTableShardingAlgorithm它们的命名和代码风格与 PreciseShardingAlgorithm 的实现类非常类似。这里也以 RangeModuloDatabaseShardingAlgorithm 为例它的实现如下所示public final class RangeModuloDatabaseShardingAlgorithm implements RangeShardingAlgorithm { Override public Collection doSharding(final Collection availableTargetNames, final RangeShardingValue shardingValue) { Collection result new LinkedHashSet(availableTargetNames.size()); //根据分片值决定分片的范围 for (Integer i shardingValue.getValueRange().lowerEndpoint(); i doSharding(final Collection availableTargetNames, final Collection shardingValues) { RouteValue shardingValue shardingValues.iterator().next(); Collection shardingResult shardingValue instanceof ListRouteValue //如果分片值是一个列表则执行 PreciseShardingAlgorithm ? doSharding(availableTargetNames, (ListRouteValue) shardingValue) //如果分片值是一个范围则 执行RangeShardingAlgorithm : doSharding(availableTargetNames, (RangeRouteValue) shardingValue); Collection result new TreeSet(String.CASE_INSENSITIVE_ORDER); result.addAll(shardingResult); return result; }可以看到这里根据传入的 shardingValues 的类型分别执行不同的 doSharding 方法如果输入的是ListRouteValue则会使用 PreciseShardingAlgorithm如下所示private Collection doSharding(final Collection availableTargetNames, final ListRouteValue shardingValue) { Collection result new LinkedList(); for (Comparable each : shardingValue.getValues()) { //使用 PreciseShardingAlgorithm 进行分片 String target preciseShardingAlgorithm.doSharding(availableTargetNames, new PreciseShardingValue(shardingValue.getTableName(), shardingValue.getColumnName(), each)); if (null ! target) { result.add(target); } } return result; }而如果是RangeRouteValue则使用 RangeShardingAlgorithm如下所示private Collection doSharding(final Collection availableTargetNames, final RangeRouteValue shardingValue) { if (null rangeShardingAlgorithm) { throw new UnsupportedOperationException(Cannot find range sharding strategy in sharding rule.); } //使用 RangeShardingAlgorithm 进行分片 return rangeShardingAlgorithm.doSharding(availableTargetNames, new RangeShardingValue(shardingValue.getTableName(), shardingValue.getColumnName(), shardingValue.getValueRange())); }4.复合分片策略 ComplexShardingStrategy与 StandardShardingStrategy 只支持单分片键不同ShardingSphere 的官网表明 ComplexShardingStrategy支持多分片键。ComplexShardingStrategy 的 doSharding 方法如下所示public Collection doSharding(final Collection availableTargetNames, final Collection shardingValues) { Map columnShardingValues new HashMap(shardingValues.size(), 1); Map columnRangeValues new HashMap(shardingValues.size(), 1); String logicTableName ; for (RouteValue each : shardingValues) { if (each instanceof ListRouteValue) { //构建 ListRouteValue columnShardingValues.put(each.getColumnName(), ((ListRouteValue) each).getValues()); } else if (each instanceof RangeRouteValue) { //构建 RangeRouteValue columnRangeValues.put(each.getColumnName(), ((RangeRouteValue) each).getValueRange()); } logicTableName each.getTableName(); } Collection shardingResult shardingAlgorithm.doSharding(availableTargetNames, new ComplexKeysShardingValue(logicTableName, columnShardingValues, columnRangeValues)); Collection result new TreeSet(String.CASE_INSENSITIVE_ORDER); result.addAll(shardingResult); return result; }这里基于传入的 RouteValue 分别构建了 ListRouteValue 和 RangeRouteValue然后传递给ComplexKeysShardingAlgorithm进行计算。由于多分片键之间的关系复杂因此 ComplexShardingStrategy 并未进行过多的封装而是直接将分片键值组合以及分片操作符透传至分片算法完全由应用开发者实现提供最大的灵活度。基于这一点考虑ShardingSphere 的 ComplexKeysShardingAlgorithm 的唯一实现类 DefaultComplexKeysShardingAlgorithm显得非常简单其代码如下所示public final class DefaultComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithm { Override public Collection doSharding(final Collection availableTargetNames, final ComplexKeysShardingValue shardingValue) { return availableTargetNames; } }可以看到 DefaultComplexKeysShardingAlgorithm 与 NoneShardingStrategy 的实现实际上是一样的相当于就是什么都没有做也就是所有的工作都需要交给开发者自行进行设计和实现。5.行表达式分片策略 InlineShardingStrategy与前面介绍的各种分片策略相比InlineShardingStrategy 采用了一种特殊的机制来实现路由。我们已经在介绍分库分表案例中大量使用了行表达式也知道在使用行表达式时需要指定一个分片列 shardingColumn 以及一个类似 ds$-{user_id % 2} 的表达式。你可能会好奇 ShardingSphere 是如何来解析这样的表达式的呢基于 InlineShardingStrategy 定义的变量我们可以找到问题的答案//分片列 private final String shardingColumn; //Groovy 中的 Closure 实例 private final Closure closure;原来ShardingSphere 在这里用到了 Groovy 中的 Closure 对象。Groovy 是可运行在 JVM 中的一种动态语言既可以用于面向对象编程又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码同时又具有 Closure 和动态语言中的其他特性。在使用方式上基本也与使用 Java 代码的方式相同。基于 Groovy 的动态语言特性InlineShardingStrategy 提供对 SQL 语句中的 和 IN 的分片操作支持目前只支持单分片键。对于类似 ds$-{user_id % 2} 这样的常见分片算法可以通过简单配置进行使用从而避免烦琐的 Java 代码开发。我们直接来到 InlineShardingStrategy 的 doSharding 方法该方法的实现过程与标准分片策略 StandardShardingStrategy 中的相同不同的是需要通过 Groovy 进行解析输入参数从而获取最终路由结果private Collection doSharding(final ListRouteValue shardingValue) { Collection result new LinkedList(); for (PreciseShardingValue each : transferToPreciseShardingValues(shardingValue)) { //通过 execute 方法解析出最终的结果 result.add(execute(each)); } return result; }这里的 execute 方法中构建了 Groovy 的 Closure 对象并设置了对应的解析策略以及所需要解析的属性并最终返回解析的结果private String execute(final PreciseShardingValue shardingValue) { //构建 Groovy 的 Closur e对象 Closure result closure.rehydrate(new Expando(), null, null); result.setResolveStrategy(Closure.DELEGATE_ONLY); result.setProperty(shardingColumn, shardingValue.getValue()); //获取解析结果 return result.call().toString(); }最后作为总结我们要注意所有的 ShardingStrategy 相关类都位于 sharding-core-common 工程的 org.apache.shardingsphere.core.strategy 包下ShardingStrategy 相关类的包结构而所有的 ShardingAlgorithm 相关类则位于 sharding-core-api 工程的 org.apache.shardingsphere.api.sharding 包下ShardingAlgorithm 相关类的包结构我们在前面已经提到过 ShardingStrategy 的创建依赖于 ShardingStrategyConfigurationShardingSphere 也提供了一个 ShardingStrategyFactory 工厂类用于创建各种具体的 ShardingStrategypublic final class ShardingStrategyFactory { public static ShardingStrategy newInstance(final ShardingStrategyConfiguration shardingStrategyConfig) { if (shardingStrategyConfig instanceof StandardShardingStrategyConfiguration) { return new StandardShardingStrategy((StandardShardingStrategyConfiguration) shardingStrategyConfig); } if (shardingStrategyConfig instanceof InlineShardingStrategyConfiguration) { return new InlineShardingStrategy((InlineShardingStrategyConfiguration) shardingStrategyConfig); } if (shardingStrategyConfig instanceof ComplexShardingStrategyConfiguration) { return new ComplexShardingStrategy((ComplexShardingStrategyConfiguration) shardingStrategyConfig); } if (shardingStrategyConfig instanceof HintShardingStrategyConfiguration) { return new HintShardingStrategy((HintShardingStrategyConfiguration) shardingStrategyConfig); } return new NoneShardingStrategy(); } }而这里用到的各种 ShardingStrategyConfiguration 也都位于 sharding-core-api 工程的org.apache.shardingsphere.api.sharding.strategy 包下ShardingStrategyConfiguration 相关类的包结构这样通过对路由引擎的介绍我们又接触到了一大批 ShardingSphere 中的源代码。至此关于 ShardingSphere 路由引擎部分的内容基本都介绍完毕。作为总结我们在《路由引擎如何理解分片路由核心类 ShardingRouter 的运作机制》中所给出的时序图中添加了 ShardingStrategy 和 ShardingAlgorithm 部分的内容如下所示从源码解析到日常开发在我们设计软件系统的过程中面对复杂业务场景时职责分离始终是需要考虑的一个设计点。ShardingSphere 对于分片策略的设计和实现很好地印证了这一观点。分片策略在 ShardingSphere 中实际上是一个比较复杂的概念但通过将分片的具体算法分离出去并提炼 ShardingAlgorithm 接口并构建 ShardingStrategy 和 ShardingAlgorithm 之间一对多的灵活关联关系我们可以更好地把握整个分片策略体系的类层结构这种职责分离机制同样可以应用与日常开发过程中。小结与预告承接上一篇的内容今天我们全面介绍了 ShardingSphere 中的五大分片策略和四种分片算法以及它们之间的组合关系。ShardingSphere 路由引擎中执行路由的过程正是依赖于这些分片策略和分片算法的功能特性。当然作为一款具有高扩展性的开源框架我们也可以基于自身的业务需求实现特定的分片算法并嵌入到具体的分片策略中。这里给你留一道思考题ShardingSphere 中分片策略与分片算法之间是如何协作的 欢迎你在留言区与大家讨论我将一一点评解答。在路由引擎的基础上下一篇将进入 ShardingSphere 分片引擎的另一个核心阶段即改写引擎。

相关文章:

《ShardingSphere解读》15 路由引擎:如何在路由过程中集成多种路由策略和路由算法?

上一篇中,我们在介绍 ShardingRule 对象时,引出了 ShardingSphere 路由引擎中的分片策略 ShardingStrategy,分片策略是路由引擎中的一个核心概念,直接影响了最终的路由结果。今天,我们将围绕这一核心概念展开讨论。 分…...

大模型开发手记(十三):langchain skills(下):构建skills架构agent实战

目录前言一、整体架构预览二、实战2.1 第一步:定义Skill文件酒店预订Skill景点推荐Skill2.2 第二步:编写Skill加载工具2.3 第三步:构建Skill中间件2.4 第四步:创建agent.py:第四步:运行与验证三、扩展思路前…...

LangChain content_blocks:统一处理多模态与跨模型厂商消息内容

目录前言一、什么是 content_blocks?补充:content 与 content_blocks 的关系二、为什么需要 content_blocks?三、如何使用 content_blocks?3.1 读取标准化内容3.2 创建消息时使用标准化块3.3 让模型直接返回标准化格式四、支持的内…...

MacBook Pro M1芯片编译hping3全记录:解决Tcl依赖与Homebrew失效问题

MacBook Pro M1芯片编译hping3实战指南:从环境配置到Tcl依赖完美解决 在网络安全研究和渗透测试领域,hping3一直被誉为"瑞士军刀"级的网络工具。然而随着macOS生态的演进,特别是Apple Silicon芯片的普及,许多传统工具的…...

Android 14开发必看:HWASAN内存检测实战指南(附Demo源码)

Android 14开发必看:HWASAN内存检测实战指南(附Demo源码) 在移动应用开发领域,内存安全问题一直是困扰开发者的顽疾。随着Android系统不断演进,Google在Android 14中进一步强化了HWASAN(Hardware-assisted …...

Firecrawl本地部署避坑指南:从Docker版本选择到Dify调用的完整流程

Firecrawl本地部署实战:从Docker选型到Dify集成的深度解析 在开源工具生态中,Firecrawl作为一款高效的网页内容提取引擎,正逐渐成为开发者处理网络数据抓取任务的首选方案。不同于简单的爬虫工具,Firecrawl提供了结构化数据输出、…...

从零开始用Firecracker构建轻量级安全容器:绕过KVM性能损耗的5个技巧

从零开始用Firecracker构建轻量级安全容器:绕过KVM性能损耗的5个技巧 在边缘计算和物联网领域,资源效率与安全隔离的平衡一直是开发者面临的难题。传统容器技术虽然轻量,但共享内核的设计难以满足高安全需求;而全功能虚拟机虽然隔…...

vue+python基于ai技术的学习资料分享平台

目录技术栈选择前端实现后端实现AI 功能集成部署与优化项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 Vue.js 作为前端框架,提供响应式界面和组件化开发。 Python 作为后端语言,搭配 Flask …...

#潮流算法# 对含分布式光伏的网络进行潮流迭代计算,确定节点电压和线损,分析电压越限原因。 此...

#潮流算法# 对含分布式光伏的网络进行潮流迭代计算,确定节点电压和线损,分析电压越限原因。 此算法纯,纯,自己一点点敲出来的呜呜呜 重要的事情说三遍,不包含原始数据,不包含原始数据…...

静态模型的边界与动态建模的突破:仓储空间认知能力重构路径—— 融合镜像视界“像素即坐标”、无感定位与行为认知的空间计算框架

静态模型的边界与动态建模的突破:仓储空间认知能力重构路径—— 融合镜像视界“像素即坐标”、无感定位与行为认知的空间计算框架一、问题界定:静态模型的能力边界已全面显现在传统仓储信息化体系中,空间建模主要依赖静态模型,其核…...

阿里云OSS直传避坑指南:Vue3中如何安全处理临时凭证(Browser.js最佳实践)

Vue3阿里云OSS直传安全实践:从临时凭证管理到防抓包设计 引言 在当今企业级应用开发中,文件上传功能几乎是标配需求。阿里云OSS作为国内领先的对象存储服务,其Browser.js直传方案能有效减轻服务器负担,但同时也带来了前端安全管理…...

OmenSuperHub:重构暗影精灵硬件控制体系的开源解决方案

OmenSuperHub:重构暗影精灵硬件控制体系的开源解决方案 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 在游戏本硬件控制领域,长期存在着厂商官方工具功能冗余与用户实际需求之间的矛盾。OmenSuperHu…...

Caffeine缓存库进阶指南:动态过期时间的3种实现方式对比

Caffeine缓存库进阶指南:动态过期时间的3种实现方式对比 在Java应用性能优化领域,缓存技术扮演着至关重要的角色。作为Guava Cache的现代替代品,Caffeine凭借其卓越的性能和灵活的API设计,已成为众多中高级Java开发者的首选缓存解…...

Windows 11终极优化指南:用Win11Debloat让你的电脑飞起来!

Windows 11终极优化指南:用Win11Debloat让你的电脑飞起来! 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其…...

Android 12 SurfaceFlinger 事务处理全流程拆解:从 queueTransaction 到 commitTransaction 到底发生了什么?

Android 12 SurfaceFlinger事务处理全流程深度解析 在Android显示系统中,SurfaceFlinger作为核心合成引擎,其事务处理机制直接决定了UI更新的流畅度与响应速度。本文将深入剖析从应用提交变更到最终合成渲染的完整事务生命周期,揭示Android 1…...

Swagger+LangChain实战:5步搞定AI自动生成接口测试脚本(附完整代码)

SwaggerLangChain实战:5步构建AI驱动的接口测试自动化流水线 在当今快速迭代的软件开发环境中,接口测试自动化已成为保障产品质量的关键环节。传统手工编写测试脚本的方式不仅效率低下,还难以应对频繁变更的接口需求。本文将介绍如何利用Swag…...

K3s国内镜像加速实战:从安装到部署Nginx的完整避坑指南

K3s国内镜像加速实战:从安装到部署Nginx的完整避坑指南 对于国内开发者而言,Kubernetes的学习和使用常常面临一个现实问题——镜像拉取缓慢甚至失败。而轻量级Kubernetes发行版K3s凭借其精简设计和低资源消耗,正成为本地开发和边缘计算的热门…...

Splunk实战:5分钟搞定Windows安全日志分析(附常见错误排查)

Splunk实战:5分钟定位Windows服务器安全威胁的黄金法则 当凌晨三点服务器告警铃声响起时,大多数运维人员的第一反应往往是手足无措。去年某金融公司遭遇的APT攻击事件中,攻击者正是利用管理员对安全日志的迟钝响应,在48小时内横向…...

django基于Python的膳食营养健康系统 基于机器学习的个人健康饮食推荐系统

目录技术选型与框架搭建数据准备与模型设计核心功能模块系统集成与部署测试与迭代示例代码片段(推荐模型训练)关键注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与框架搭建 后端框架&…...

解决pytorch_quantization安装难题:从错误到成功的完整指南

1. 为什么你的pytorch_quantization安装总是失败? 最近在折腾模型量化时,发现很多同行都在pytorch_quantization这个工具包的安装上栽了跟头。我自己也反复折腾了好几次,总结下来主要有三大坑:源配置冲突、依赖缺失和环境不兼容。…...

【技术解读】NeuroLM:当EEG成为LLM的“第二语言”,多任务脑电分析的统一范式

1. 当脑电波遇上大语言模型:NeuroLM的技术革命 想象一下,如果你的脑电波能像外语一样被AI翻译和理解,会是怎样的场景?这正是NeuroLM带来的颠覆性突破。这个将EEG(脑电图)信号视为"第二语言"的通用…...

Mapbox-GL 2.x 收费了?别慌,手把手教你无缝迁移到免费开源的 Maplibre-GL

Mapbox-GL 2.x 收费迁移指南:零成本切换至Maplibre-GL的实战手册 当Mapbox-GL-JS在2.x版本转向闭源收费模式时,许多依赖其开源特性的开发者陷入了两难。本文将带你深入剖析迁移到Maplibre-GL的技术路径,从API兼容性测试到样式文件转换&#x…...

(-aaa-) Multipass 1.17.x 打通了:虚拟机与宿主机的双向访问历史难点,不再需要设置麻烦的网桥、iptables、nftables 了? (***)

Multipass 解决了&#xff1a;虚拟机与宿主机的双向访问历史难点?mpqemubr0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.59.27.1 netmask 255.255.255.0 broadcast 10.59.27.255这个难点难道是通过在宿主机中设置了网关 mpqemubr0: 的缘故吗&#…...

零信任组网新玩法:用天翼云AccessOne和朋友共享本地K8s集群(避坑指南)

零信任组网新玩法&#xff1a;用天翼云AccessOne和朋友共享本地K8s集群&#xff08;避坑指南&#xff09; 在数字化协作日益普及的今天&#xff0c;如何安全地共享本地资源成为技术爱好者们关注的焦点。传统VPN方案虽然能实现远程访问&#xff0c;但存在权限控制粗放、内网暴露…...

# 蒙特卡罗 #Monte Carlo #风电功率预测 #Kmeans 1 采用蒙特卡洛法仿真

# 蒙特卡罗 #Monte Carlo #风电功率预测 #Kmeans1 采用蒙特卡洛法仿真&#xff0c;生成n组随机风功率出力场景&#xff1b; 2 利用Kmeans算法对n个场景进行聚类&#xff0c;缩减场景&#xff1b; 3 求出缩减后的场景对应的出力概率&#xff1b;并求出不确定出力曲线。 &#xf…...

Vue Flow实战:5分钟搞定工业设备流程图(附完整代码)

Vue Flow工业流程图实战&#xff1a;5分钟构建产线可视化系统 在工业自动化领域&#xff0c;设备连接流程的可视化一直是工程师们的痛点。传统绘图工具难以满足动态调整需求&#xff0c;而专业工业软件又过于笨重。Vue Flow作为基于Vue.js的轻量级流程图库&#xff0c;恰好填补…...

基于A*算法的往返式全覆盖路径规划的改进算法及MATLAB实现代码

基于A*算法的往返式全覆盖路径规划的改进算法 matlab实现代码 算法一 &#xff05;&#xff05;往返式全覆盖路径规划 &#xff05;通过建立二维栅格地图&#xff0c;设置障碍物&#xff0c;以及起始点 &#xff05;根据定义往返式路径规划的定义的优先级运动规则从起始点开始进…...

ABAQUS纤维复合材料热固化仿真:子粘弹性模型与内附CAE文件

ABAQUS纤维复合材料热固化仿真子粘弹性模型&#xff0c;内附CAE文件搞纤维复合材料热固化仿真的兄弟应该都懂&#xff0c;固化过程那个应力变化简直玄学。ABAQUS自带的粘弹性模型有时候跟实际曲线对不上号&#xff0c;自己写子程序又容易掉头发。最近折腾了个基于广义Maxwell模…...

基于华为eNSP的园区网防火墙高可靠与安全策略实战

1. 华为eNSP与园区网防火墙入门指南 第一次接触华为eNSP模拟器时&#xff0c;我被它强大的网络设备仿真能力震撼到了。这个免费的模拟器不仅能完整还原华为路由交换设备的功能&#xff0c;还能模拟防火墙、AC等安全设备&#xff0c;特别适合我们这些需要实践但又缺乏真实设备的…...

Matlab遗传优化算法求解生鲜配送问题的路径优化与时间窗管理:考虑新鲜度与货损成本的解决方案...

Matlab遗传优化算法等算法 求解 生鲜配送问题 路径优化 时间窗 新鲜度 货损成本 等约束 程序算法参考文献半夜盯着冷库监控屏的时候&#xff0c;突然想到生鲜配送这活儿真是比炒菜还讲究火候。既要卡着菜市场凌晨三点半的到货时间&#xff0c;又要保证超市货架上的绿叶菜在早…...