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

于键值(KV)的表

基于键值(KV)的表

在这里插入图片描述

将行编码为键值(KVs)

索引查询:点查询和范围查询

在关系型数据库中,数据被建模为由行和列组成的二维表。用户通过SQL表达他们的意图,而数据库则神奇地提供结果。不那么神奇的是,虽然数据库可以执行任意查询,并非所有查询在OLTP工作负载中都是实际可行的(高效且可扩展),并且OLTP总是要求用户通过适当的模式和索引设计来控制查询的执行方式。

一个索引查询的执行归结为两个操作:

  1. 点查询:根据给定的键查找一行。
  2. 范围查询:根据一个范围查找多行;以排序顺序迭代结果。

这就是为什么B+树和LSM树被认为是适用的,而哈希表则不然。

主键作为“键”

首先考虑点查询。要找到一行,必须有一种方法唯一标识该行,这就是主键,它是列的一个子集。

create table t1 (k1 string,k2 int,v1 string,v2 string,primary key (k1, k2)
);
表名
t1k1, k2v1, v2
作为单独表的辅助索引

除了主键外,表可以通过多种方式进行索引。这是通过额外的间接层解决的:辅助索引。

create table t1 (k1 string,k2 int,v1 string,v2 string,primary key (k1, k2),index idx1 (v1),index idx2 (v2, v1)
);

逻辑上,每个索引就像一个单独的表:

create table idx1 (-- 索引键 (v1)v1 string,-- 主键 (k1, k2)k1 string,k2 int
);create table idx2 (-- 索引键 (v2, v1)v2 string,v1 string,-- 主键 (k1, k2)k1 string,k2 int
);

为找到唯一的主键增加了额外的键。

表名
t1k1, k2v1, v2
idx1v1k1, k2
idx2v2, v1k1, k2

主键也是一种索引,但它具有唯一约束。

替代方案:自动生成的行ID

一些数据库使用自动生成的ID作为“真正的”主键,而不是用户选择的主键。在这种情况下,主键和次键之间没有区别;用户主键也是一个间接层。

表名
t1IDk1, k2, v1, v2
primary keyk1, k2ID
idx1v1ID
idx2v2, v1ID

优点在于自动生成的ID可以是一个小的、固定宽度的整数,而用户主键则可以任意长。这意味着…

  • 对于ID键,内部节点可以存储更多的键(更短的树)。
  • 辅助索引更小,因为它们不会重复用户主键。

数据库模式

表前缀

一个数据库可以包含多个表和索引。我们将为键添加一个自动生成的前缀,以便它们能够共享单个B+树。这样做比维护多个树的工作量要少。

以下是将给定内容转换成表格的形式:

keyvalue
table1prefix1 + columns…columns…
table2prefix2 + columns…columns…
index1prefix3 + columns…columns…

这个表格展示了不同表和索引的键值对结构,其中 key 列表示表或索引的名称,而 value 列则描述了对应的前缀和列信息。

前缀是一个32位自增整数,你也可以使用表名代替,但缺点是它可能会非常长。

数据类型

关系型数据库优于键值存储的一个优点是支持更多的数据类型。为了反映这一点,我们将支持两种数据类型:字符串(string)和整数(integer)。

  • 数据类型:与仅能存储简单键值对的键值存储不同,关系型数据库支持更丰富的数据类型。这里提到的支持两种基本的数据类型——字符串和整数,意味着数据库可以存储文本信息和数值信息,从而提供了更高的灵活性和功能。例如,在创建表时,你可以指定列的数据类型为字符串或整数,这有助于确保数据的一致性和正确性。

常量定义

const (TYPE_BYTES = 1 // 字符串(任意字节)TYPE_INT64 = 2 // 整数;64位有符号
)
  • TYPE_BYTES 表示字符串类型,可以存储任意字节。
  • TYPE_INT64 表示整数类型,使用64位有符号整数。

单元格值结构

// 表单元格
type Value struct {Type uint32 // 类型标记的联合体I64  int64  // 整数值Str  []byte // 字符串值
}
  • Value 是一个带有类型标记的联合体,具体类型由 Type 字段决定。
    • 如果 Type == TYPE_BYTES,则使用 Str 字段存储字符串数据。
    • 如果 Type == TYPE_INT64,则使用 I64 字段存储整数数据。

表记录结构

// 表行
type Record struct {Cols []string // 列名Vals []Value  // 列值
}
  • Record 表示一行数据,包含列名和对应的列值。
  • 列名和列值通过数组的形式一一对应。
添加字符串值的方法
func (rec *Record) AddStr(col string, val []byte) *Record {rec.Cols = append(rec.Cols, col)rec.Vals = append(rec.Vals, Value{Type: TYPE_BYTES, Str: val})return rec
}
  • AddStr 方法用于向记录中添加一个字符串类型的列值。
  • 参数:
    • col:列名。
    • val:列值(字符串)。
  • 返回值:更新后的记录对象。
添加整数值的方法
func (rec *Record) AddInt64(col string, val int64) *Record
  • AddInt64 方法用于向记录中添加一个整数类型的列值。
  • 参数:
    • col:列名。
    • val:列值(整数)。
  • 返回值:更新后的记录对象。
获取列值的方法
func (rec *Record) Get(col string) *Value
  • Get 方法根据列名返回对应的列值。
  • 参数:
    • col:列名。
  • 返回值:指向列值的指针。

表模式定义

type TableDef struct {// 用户定义的部分Name   string   // 表名Types  []uint32 // 列类型Cols   []string // 列名PKeys  int      // 主键列的数量// 前 `PKeys` 列是主键// 不同表的自动分配的 B 树键前缀Prefix uint32
}
  • TableDef 定义了表的模式:
    • Name:表名。
    • Types:列的数据类型(每个列对应一个类型)。
    • Cols:列名。
    • PKeys:主键列的数量,表示前 PKeys 列为主键。
    • Prefix:为不同表自动生成的 B 树键前缀。

内部表

存储表模式的内部表
var TDEF_TABLE = &TableDef{Prefix: 2,Name: "@table",Types: []uint32{TYPE_BYTES, TYPE_BYTES},Cols: []string{"name", "def"},PKeys: 1,
}
  • TDEF_TABLE 是一个预定义的内部表,用于存储其他表的模式信息。
  • 结构:
    • name:表名。
    • def:表模式的 JSON 序列化内容。
  • 示例:
create table `@table` (`name` string, -- 表名`def` string, -- 模式primary key (`name`)
);
存储元信息的内部表
var TDEF_META = &TableDef{Prefix: 1,Name: "@meta",Types: []uint32{TYPE_BYTES, TYPE_BYTES},Cols: []string{"key", "val"},PKeys: 1,
}
  • TDEF_META 是另一个预定义的内部表,用于存储额外的元信息。
  • 结构:
    • key:键名。
    • val:键值。
  • 示例:
    create table `@meta` (`key` string, -- 键名`val` string, -- 键值primary key (`key`)
    );
    

总结

  • 核心结构

    • Value:单元格值,支持字符串和整数两种类型。
    • Record:表的一行数据,包含列名和列值。
    • TableDef:表的模式定义,包括表名、列名、列类型、主键列数量和 B 树前缀。
  • 内部表

    • @table:存储所有表的模式信息。
    • @meta:存储数据库的元信息,例如表前缀计数器。

这种设计使得数据库能够动态管理表模式和元信息,同时利用 B 树高效地存储和查询数据。

获取、更新、插入、删除和创建操作

点查询和更新接口

以下是用于读取和写入单行数据的接口定义:

func (db *DB) Get(table string, rec *Record) (bool, error)
func (db *DB) Insert(table string, rec Record) (bool, error)
func (db *DB) Update(table string, rec Record) (bool, error)
func (db *DB) Upsert(table string, rec Record) (bool, error)
func (db *DB) Delete(table string, rec Record) (bool, error)
  • Get:通过主键获取一行数据。
  • Insert:仅插入新行(如果主键已存在,则失败)。
  • Update:仅更新现有行(如果主键不存在,则失败)。
  • Upsert:插入新行或更新现有行。
  • Delete:删除指定行。

数据库结构

数据库包装了键值存储(KV):

type DB struct {Path string // 数据库路径kv   KV     // 键值存储接口
}

按主键查询

函数 dbGet 是按主键查询的核心实现。输入的 rec 参数表示主键,同时也是输出的结果行。

func dbGet(db *DB, tdef *TableDef, rec *Record) (bool, error) {// 1. 根据模式重新排列输入列values, err := checkRecord(tdef, *rec, tdef.PKeys)if err != nil {return false, err}// 2. 编码主键key := encodeKey(nil, tdef.Prefix, values[:tdef.PKeys])// 3. 查询键值存储val, ok := db.kv.Get(key)if !ok {return false, nil}// 4. 解码值到列for i := tdef.PKeys; i < len(tdef.Cols); i++ {values[i].Type = tdef.Types[i]}decodeValues(val, values[tdef.PKeys:])rec.Cols = tdef.Colsrec.Vals = valuesreturn true, nil
}

步骤说明

  1. 重新排序列:根据表模式重新排列输入列,并检查是否有缺失列。
  2. 编码主键:将主键列编码为字节序列。
  3. 查询键值存储:通过主键从键值存储中获取对应的值。
  4. 解码值:将存储的值解码为列值,并填充到记录中。

获取表模式

用户接口通过表名引用表,因此需要先获取表模式。

func (db *DB) Get(table string, rec *Record) (bool, error) {tdef := getTableDef(db, table)if tdef == nil {return false, fmt.Errorf("table not found: %s", table)}return dbGet(db, tdef, rec)
}

获取表模式的实现

func getTableDef(db *DB, name string) *TableDef {rec := (&Record{}).AddStr("name", []byte(name))ok, err := dbGet(db, TDEF_TABLE, rec)assert(err == nil)if !ok {return nil}tdef := &TableDef{}err = json.Unmarshal(rec.Get("def").Str, tdef)assert(err == nil)return tdef
}
  • 表模式存储在内部表 @table 中。
  • 使用 JSON 序列化和反序列化来处理表模式。

优化:可以将表模式缓存到内存中,以减少查询次数。


插入或更新行

SQL 更新语句有三种不同的行为:

  1. INSERT:仅添加新行(如果主键已存在,则失败)。
  2. UPDATE:仅修改现有行(如果主键不存在,则失败)。
  3. UPSERT:添加新行或修改现有行。

实现方式是扩展 BTree.Insert 方法,增加一个模式标志:

// 更新模式
const (MODE_UPSERT       = 0 // 插入或替换MODE_UPDATE_ONLY  = 1 // 仅更新现有键MODE_INSERT_ONLY  = 2 // 仅添加新键
)type UpdateReq struct {tree *BTree// 输出Added bool // 是否添加了新键// 输入Key  []byteVal  []byteMode int
}func (tree *BTree) Update(req *UpdateReq)

核心更新逻辑

func dbUpdate(db *DB, tdef *TableDef, rec Record, mode int) (bool, error) {values, err := checkRecord(tdef, rec, len(tdef.Cols))if err != nil {return false, err}key := encodeKey(nil, tdef.Prefix, values[:tdef.PKeys])val := encodeValues(nil, values[tdef.PKeys:])return db.kv.Update(key, val, mode)
}
  • 部分更新(读取-修改-写入)在更高层次(如查询语言)实现。

创建表

创建表的过程包括以下步骤:

  1. 检查 @table 是否存在重复表名。
  2. @meta 中读取表前缀计数器。
  3. 增加并更新表前缀计数器。
  4. 将表模式插入到 @table 中。
func (db *DB) TableNew(tdef *TableDef) error
  • 此过程涉及更新两个键,因此目前缺乏原子性。可以在后续引入事务时修复此问题。

结论:基于键值存储的表

基于键值存储的表与传统关系型数据库并没有根本区别,只是增加了数据序列化和模式管理的额外步骤。

下一步工作

  1. 支持范围查询。
  2. 实现二级索引。

代码仓库地址:database-go

相关文章:

于键值(KV)的表

基于键值&#xff08;KV&#xff09;的表 将行编码为键值&#xff08;KVs&#xff09; 索引查询&#xff1a;点查询和范围查询 在关系型数据库中&#xff0c;数据被建模为由行和列组成的二维表。用户通过SQL表达他们的意图&#xff0c;而数据库则神奇地提供结果。不那么神奇的…...

Matlab算例运行

1. 使用终端命令运行算例&#xff1a; 2. 如果点击Run 按钮就是会一直报错&#xff0c;所以直接改成终端运行算例...

package.json script 中的 prepare 脚本的作用是什么

在 package.json 的 scripts 中&#xff0c;prepare 脚本是一个特殊的生命周期脚本&#xff0c;主要作用和执行时机如下&#xff1a; prepare 脚本的作用和执行时机 执行时机&#xff1a; 在执行 npm publish 命令之前运行。在执行不带参数的 npm install 命令时运行&#xff…...

图论---最大流(Dinic)

最大流一定是阻塞流&#xff0c;阻塞流不一定是最大流。 阻塞流---从起点到终点的管道已经阻塞了。 时间复杂度&#xff1a; 一般情况&#xff1a;O(n2m)O(n2m)&#xff08;但实际运行效率较高&#xff0c;尤其在稀疏图上&#xff09;。 使用当前弧优化后&#xff0c;效率接近…...

FastAPI系列06:FastAPI响应(Response)

FastAPI响应&#xff08;Response&#xff09; 1、Response入门2、Response基本操作设置响应体&#xff08;返回数据&#xff09;设置状态码设置响应头设置 Cookies 3、响应模型 response_model4、响应类型 response_classResponse派生类自定义response_class 在“FastAPI系列0…...

双目RealSense系统配置rs_camera.launch----实现D435i自制rosbag数据集到离线场景的slam建图

引言 Intel RealSense系列相机因其出色的深度感知能力和灵活的配置选项&#xff0c;在机器视觉与应用中得到广泛应用。大家在后期的slam学习中&#xff0c;无论是对算法本身的性能要求还是实验的泛化性都有一定的要求&#xff0c;那么公开的数据集如kitti、tum、Eourc不能满足…...

【MCP-2】MCP是什么,利用智普大模型在MaxKB中调用自己开发的MCP服务

在上一篇【MCP-1】MCP是什么&#xff0c;从DEMO入手文章中我们介绍了MCP是什么、他能干啥&#xff0c;以及简单的Demo示例等&#xff0c;这篇文章我们使用MaxKB这个工具&#xff0c;利用智普大模型&#xff0c;看看MCP到底怎么用。 创建SSE协议的MCP服务 在上篇文章中的Demo是…...

Allegro23.1新功能之如何单独关闭铜皮显示效果操作指导

Allegro23.1新功能之如何单独关闭铜皮显示效果操作指导 Allegro升级到了23.1的时候,支持单独关闭铜皮显示 ,如下图 如何仅关闭shape的显示,单独显示线,具体操作如下 点击setup...

《从分遗产说起:JS 原型与继承详解》

“天天开心就好” 先来讲讲概念&#xff1a; 原型&#xff08;Prototype&#xff09; 什么是原型&#xff1f; 原型是 JavaScript 中实现对象间共享属性和方法的机制。每个 JavaScript 对象&#xff08;除了 null&#xff09;都有一个内部链接指向另一个对象&#xff0c;这…...

【Part 2安卓原生360°VR播放器开发实战】第二节|基于等距圆柱投影方式实现全景视频渲染

《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化&#xff0c;以及高分辨率视频性能优化等实战技巧。 &#x1f4dd; 希望通过这个专栏&am…...

Android——RecyclerView

RecyclerView的使用 依赖 implementation("androidx.recyclerview:recyclerview:1.4.0")activity_recyclerview.xml <androidx.recyclerview.widget.RecyclerViewandroid:id"id/rv"android:layout_width"match_parent"android:layout_height…...

跨域问题(Cross-Origin Problem)

跨域问题&#xff08;Cross-Origin Problem&#xff09;是浏览器出于安全考虑&#xff0c;对不同源&#xff08;协议、域名、端口&#xff09;之间的资源访问进行限制而引发的限制。以下是详细解释&#xff1a; 1. 核心定义 跨域&#xff1a;当一个网页&#xff08;源A&#x…...

阿里云直接对系统云盘扩容

阿里云直接对系统云盘扩容 登录阿里云控制台&#xff0c;进入ECS实例管理页面&#xff0c;检查目标磁盘的容量是否已更新为扩容后的数值。通过SSH远程连接服务器&#xff0c;使用命令 lsblk 或 fdisk -l 查看当前磁盘分区和容量&#xff0c;确认扩容后的物理磁盘已被系统识别。…...

Java大厂面试突击:从Spring Boot自动配置到Kafka分区策略实战解析

第一轮核心知识 面试官&#xff1a;请解释Spring Boot中自动配置的工作原理并演示如何自定义一个ConfigurationProperties组件&#xff1f; xbhog&#xff1a;自动配置通过EnableAutoConfiguration注解触发&#xff0c;结合当前环境判断&#xff08;如是否检测到MyBatis依赖&…...

【python】lambda用法(结合例子理解)

目录 lambda 是什么? 为什么叫 lambda? 语法 举例 1. 最简单的 lambda:单个数字处理 2. 用 lambda 排序一组字符串(按照长度排序) 3. 在列表里找出绝对值最小的数字 4. 给 map() 用 lambda 5. 组合使用:筛选出偶数 lambda 和 def 的对比 lambda 适合用在什么地…...

前端Ui设计工具

PS 稿、蓝湖、Sketch 和 Figma 前端 UI 设计工具的对比分析 PS 稿&#xff08;Adobe Photoshop&#xff09; 提供精准设计细节&#xff1a;PS 稿能让前端更精准地理解页面布局、元素尺寸、颜色等&#xff0c;通过精确测量和查看信息面板&#xff0c;把握设计元素的空间关系、…...

深入探索Python Pandas:解锁数据分析的无限可能

放在前头 深入探索Python Pandas&#xff1a;解锁数据分析的无限可能 深入探索Python Pandas&#xff1a;解锁数据分析的无限可能 在当今数据驱动的时代&#xff0c;高效且准确地处理和分析数据成为了各个领域的关键需求。而Python作为一门强大且灵活的编程语言&#xff0c;…...

django admin 设置字段不可编辑

在Django中&#xff0c;如果你想让管理员在后台管理界面中无法编辑某个字段&#xff0c;你可以通过在模型的Meta类中设置editable属性为False&#xff0c;或者在admin.py文件中使用readonly_fields属性来实现。 方法1&#xff1a;在模型中使用Meta类设置 你可以在模型的Meta类…...

AI在医疗领域的10大应用:从疾病预测到手术机器人

AI在医疗领域的10大应用&#xff1a;从疾病预测到手术机器人 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI在医疗领域的10大应用&#xff1a;从疾病预测到手术机器人摘要引言1. 医学影像诊断&#xff1a;从静态…...

深入理解 Java 单例模式:从基础到最佳实践

单例&#xff08;Singleton&#xff09;模式是 Java 中最基本、最常用的设计模式之一。它确保一个类在任何情况下都只有一个实例&#xff0c;并提供一个全局访问点来获取这个唯一的实例。 一、为什么需要单例模式&#xff1f;&#xff08;使用场景&#xff09; 单例模式主要适…...

Rust:安全与性能兼得的现代系统编程语言

一、起源与设计理念 Rust 是由 Mozilla 研究院 Graydon Hoare 于 2006 年发起设计的系统级编程语言&#xff0c;其诞生源于传统系统语言&#xff08;如 C/C&#xff09;在内存安全与并发编程方面的缺陷。经过近十年的迭代&#xff0c;Rust 1.0 稳定版于 2015 年正式发布&#…...

AI赋能智慧医疗新范式:小天互连即时通讯打造高效、安全的医疗通讯平台

在医疗行业&#xff0c;高效的信息协作与严格的数据安全不仅直接关系患者诊疗效率&#xff0c;更是医院现代化管理的核心命题。小天互连即时通讯系统通过将智能化功能与医疗场景深度结合&#xff0c;打造出全链路数字化协作平台&#xff0c;有效破解了传统沟通模式的效率瓶颈&a…...

图像生成新势力:GPT-Image-1 与 GPT-4o 在智创聚合 API 的较量

在人工智能领域&#xff0c;图像生成技术正迅速发展&#xff0c;OpenAI 推出的 GPT-Image-1 和 GPT-4o 在图像生成方面展现出了强大的能力。智创聚合 API 平台已支持这两个模型&#xff0c;并且其图片生成 / 编辑工作台支持图片的循环编辑等功能&#xff0c;为用户提供了更便捷…...

如何避免爬虫因Cookie过期导致登录失效

1. Cookie的作用及其过期机制 1.1 什么是Cookie&#xff1f; Cookie是服务器发送到用户浏览器并保存在本地的一小段数据&#xff0c;用于维持用户会话状态。爬虫在模拟登录后&#xff0c;通常需要携带Cookie访问后续页面。 1.2 Cookie为什么会过期&#xff1f; 会话Cookie&…...

集成方案 | Docusign + 甄零科技,赋能企业海外业务高效增长!

本文将详细介绍 Docusign 与甄零科技的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 甄零科技是一家专注于数字化合同管理系统的 SaaS 解决方案提供商&#xff0c;致力于为企业打造“…...

【Arxiv 2025】Single Image Iterative Subject-driven Generation and Editing

文章目录 文章标题作者及研究团队介绍01 在论文所属的研究领域&#xff0c;有哪些待解决的问题或者现有的研究工作仍有哪些不足&#xff1f;02 这篇论文主要解决了什么问题&#xff1f;03 这篇论文解决问题采用的关键解决方案是什么&#xff1f;04 这篇论文的主要贡献是什么&am…...

CoOAG:首个捕捉学术研究兴趣动态演变的数据集

2025-04-24&#xff0c;由西安交通大学基于学术合作网络构建一种新的动态图数据集CoOAG&#xff0c;用于研究动态图中的节点分类问题。该数据集通过捕捉作者研究兴趣的动态变化&#xff0c;为动态图学习领域提供了新的研究方向和测试平台&#xff0c;特别是在标签受限的动态节点…...

决策树随机深林

决策树和随机森林是机器学习中常用的两种模型&#xff0c;以下是对它们的简单介绍&#xff1a; 决策树 - 原理&#xff1a;通过一系列的条件判断对样本进行分类或预测。它由节点&#xff08;内部节点是属性上的测试&#xff0c;叶节点是类别或值&#xff09;和边组成&#xff0…...

Unity 和 Unreal Engine(UE) 两大主流游戏引擎的核心使用方法

以下是 Unity 和 Unreal Engine&#xff08;UE&#xff09; 两大主流游戏引擎的核心使用方法和对比分析&#xff0c;帮助开发者快速上手并根据项目需求选择合适工具&#xff1a; 一、Unity 使用指南 1. 安装与配置 安装&#xff1a;从 Unity Hub 下载&#xff0c;选择长期支持…...

Maven 依赖范围(Scope)详解

Maven 依赖范围&#xff08;Scope&#xff09;详解 Maven 是一个强大的项目管理工具&#xff0c;广泛用于 Java 开发中构建、管理和部署应用程序。在使用 Maven 构建项目时&#xff0c;我们经常需要引入各种第三方库或框架作为项目的依赖项。通过在 pom.xml 文件中的 <depe…...

博物馆除湿控湿保卫战:M-5J1R 电解除湿科技如何重塑文物守护的未来

在卢浮宫幽深的长廊里&#xff0c;达芬奇的《蒙娜丽莎》正经历着一场看不见的战争——不是来自时间的侵蚀&#xff0c;而是空气中无形的水分子。每一件文物都在与湿度进行着无声的抗争&#xff0c;这场抗争关乎人类文明的延续。湿度&#xff0c;这个看不见的文物杀手&#xff0…...

消防应急物资智能调用立库:豪越科技助力消防“速战速决”

在消防救援的战场上&#xff0c;时间就是生命&#xff0c;每一秒都关乎着人民群众的生命财产安全。然而&#xff0c;在过去的紧急救援中&#xff0c;应急物资无法及时到位的情况时有发生&#xff0c;成为制约救援效率的关键难题&#xff0c;给救援工作带来了巨大的困境。 想象一…...

机器学习基础理论 - 分类问题评估指标

几个定义:混淆矩阵 TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数TN: True Negatives, 表示实际为负例且被分类…...

深度学习4.1 多层感知机

基本概念 多层感知机&#xff08;Multilayer Perceptron, MLP&#xff09;是一种‌前馈人工神经网络‌&#xff0c;由输入层、至少一个隐藏层和输出层组成。 ‌核心特点‌&#xff1a; 采用‌全连接结构‌&#xff08;相邻层神经元全部相连&#xff1b; 通过‌非线性激活函数‌…...

解决两个技术问题后小有感触-QZ Tray使用经验小总结

老朋友都知道&#xff0c;我现在是一家软件公司销售部门的项目经理和全栈开发工程师&#xff0c;就是这么“奇怪”的岗位&#xff0c;大概我是公司销售团队里比较少有技术背景、销售业绩又不那么理想的销售。 近期在某个票务系统项目上驻场&#xff0c;原来我是这个项目的项目…...

非计算机专业如何利用AI开展跨学科和交叉研究

对于非计算机专业的研究者&#xff0c;利用AI开展跨学科研究既充满机遇也面临挑战。以下是一份系统化的指南&#xff0c;帮助您高效入门并找到交叉研究的突破口&#xff1a; 一、认知重塑&#xff1a;理解AI的本质与局限 AI不是“黑箱”&#xff1a;现代AI以数据驱动为核心&a…...

Python 数据可视化进阶:精准插入图表到指定 Excel 工作表

Python 数据可视化进阶&#xff1a;精准插入图表到指定 Excel 工作表 在处理数据的过程中&#xff0c;我们常常需要将生成的图表精准地插入到已存在数据的 Excel 文件的指定工作表中。借助 Python 的强大库组合&#xff0c;这一操作得以高效实现。以下是经过优化和注释补充的代…...

MQTT - MQTT 实践(Windows EMQX、MQTTX、客户端认证、连接与主题)

概述 -说明概括MQTT消息队列遥测传输协议一种规则EMQX一款大规模分布式物联网接入平台一个平台MQTTXMQTT 客户端一个工具 工具&#xff08;MQTTX&#xff09;和平台&#xff08;EMQX&#xff09;间遵循规则&#xff08;MQTT&#xff09;即可进行双向通信 一、Windows EMQX 下…...

【计算机网络物理层】从信号传输到介质选型的核心技术解析

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;信号模拟&#xff09;运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、…...

云原生--核心组件-容器篇-5-Docker核心之-容器

1、Docker容器的定义与核心概念 定义&#xff1a; Docker容器是基于Docker镜像运行的轻量级、独立、可移植的运行环境&#xff0c;它封装了应用程序及其依赖项&#xff0c;提供了一个隔离的执行空间。容器化应用比传统的虚拟机更加高效&#xff0c;因为它们共享主机操作系统的内…...

一、I/O的相关概念

I/O的相关概念 1、I/O I/O即Input和Output&#xff0c;用户进程执行I/O操作&#xff0c;归结起来&#xff0c;也就是向操作系统发出请求&#xff0c;读请求就把数据填到缓冲区里&#xff0c;写数据就把缓冲区里数据排干&#xff0c;目的地可以是磁盘也可以是其他通道。进程通…...

django filter 日期大于当前日期的

在Django中&#xff0c;如果你想要过滤出日期大于当前日期的记录&#xff0c;你可以使用Django的QuerySet API中的__gt&#xff08;大于&#xff09;操作符。这里是如何做到这一点的步骤&#xff1a; 确定你的模型&#xff1a;首先&#xff0c;确保你有一个模型&#xff08;Mo…...

Unreal Engine 实现智慧水库周边环境以及智慧社区模拟的实例

下面分别为你介绍使用 Unreal Engine 实现智慧水库周边环境以及智慧社区模拟的实例。 智慧水库周边环境模拟 1. 场景搭建 地形与地理特征&#xff1a;利用 Unreal Engine 的地形编辑工具&#xff0c;依据水库实际的地理测绘数据构建地形。模拟山脉、丘陵、河流等周边地貌&am…...

[MCU]SRAM

MCU存储体系 1.SRAM 2.FLASH 3.TCM SRAM SRAM&#xff08;Static Random-Access Memory&#xff09;:静态随机存取存储器. 特点&#xff1a;访问速度快、断电丢失、不 SRAM分类 1.系统SRAM&#xff1a;连接在系统总线上&#xff0c;所有外设和CPU都可访问 2.TCM SRAM&…...

【dockerredis】用docker容器运行单机redis

一、实验环境 操作系统&#xff1a;CentOS7.5 Minimal docker版本&#xff1a;18.06-ce redis版本&#xff1a;6.0.6 二、安装docker 关闭selinux # setenforce 0 # sed -i s/^SELINUX.*/SELINUXpermissive/g /etc/selinux/config 下载docker二进制安装包 # yum -y install…...

游戏引擎学习第247天:简化DEBUG_VALUE

欢迎。关于纹理传输的详细情况。 上周我们刚刚完成了纹理下载的相关工作&#xff0c;但实际上并没有完全解决这个问题。问题的核心是&#xff0c;当前关于纹理下载的正确方式仍然存在较大的不确定性。尽管我们在进行纹理下载的工作时已有一定进展&#xff0c;但依旧有不少模糊…...

Super Sample Tasker 学习-1

一、Super-Simple Tasker (SST) 是一个基于事件的、抢占式的、优先级基础的实时操作系统&#xff08;RTOS&#xff09;内核&#xff0c;完全符合 Rate Monotonic Analysis/Scheduling (RMA/RMS) 的要求。 此STT RTOS主要分成两大类&#xff0c;分别是抢占式SST和非抢占式STT0&…...

【C++】类和对象【中上】

目录 一、类与对象1、构造函数2、析构函数3、拷贝构造函数 个人主页<—请点击 C专栏<—请点击 一、类与对象 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默…...

概率论与统计(不确定性分析)主要应用在什么方面?涉及到具体知识是什么?

用户问的是概率论与统计&#xff08;不确定性分析&#xff09;的主要应用方面&#xff0c;涉及的具体知识以及具体公式。首先&#xff0c;我需要确定概率论与统计在哪些领域有应用&#xff0c;比如工程、金融、医学、数据科学等等。然后&#xff0c;具体知识部分应该包括概率论…...

java面向对象编程【高级篇】之多态

目录 &#x1f680;前言&#x1f914;什么是多态&#xff1f;&#x1f31f;多态的优缺点&#x1f4af;优点&#x1f4af;缺点 &#x1f31f;类型转换&#x1f4af;自动类型转换&#x1f4af;强制类型转换 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介绍java…...