图文详见我的微信公众号<<大数据架构之道与术>> URL如下:
数据库数据结构索引&B树&B+树&LSM树解密
https://mp.weixin.qq.com/s?__biz=Mzg4MTY3MzA0NQ==&mid=2247484073&idx=1&sn=f3bb5f74c301b1d80c70d30cbd86b3ec&chksm=cf631493f8149d85085378d264ef916197e4f13f352fa434b2420ac16f0cb620f8cc597d2560
我的原创。
----------------------------------------------------------------------------------------------------------------
数据库数据结构-索引
对于一个数据库的性能来说,其数据的组织方式至关重要。从数据库的文件组织方式聊起。众所周知,数据库的数据大多存储在磁盘上,而磁盘的访问相对内存的访问来说是一项很耗时的操作。因此,提高数据库数据的查找速度的关键点之一便是尽量减少磁盘的访问次数。
为了加速数据库数据的访问,大多传统的关系型数据库都会使用特殊的数据结构来帮助查找数据,这种数据结构叫作索引(Index)。
对于传统的关系型数据库,考虑到经常需要范围查找某一批数据,因此其索引一般不使用Hash算法,而使用树(Tree)结构。然而,树结构的种类很多,却不一定都适合用于做数据库索引。
索引对树结构的选择
1.二叉查找树与平衡二叉树
最常见的树结构是二叉查找树(Binary Search Tree),它就是一颗二叉有序树:保证左子树上所有节点的值都小于根节点的值,而右子树上所有
节点的值都大于根节点的值。其优点在于实现简单,并且树在平衡的状态下查找效率能达到O(log2N);缺点是在极端非平衡情况下查找效率会退化到O(N),
因此很难保证索引的效率。
针对上述二叉查找树的缺点,人们很自然就想到是否能用平衡二叉树(Balanced Binary Tree)来解决这个问题。但是平衡二叉树依然有个比较大的问题:它的
树高为log2N——对于索引树来说,树的高度越高,意味着查找所要花费的访问次数就越多,查询效率越低。
况且,主存从磁盘读数据一般以页为单位,因此每次访问磁盘都会读取多个扇区的数据(比如4KB大小的数据),远大于单个二叉树节点的值(字节级别),这也是
造成二叉树相对索引树效率地下的原因。正因如此,人们就想到了通过增加每个树节点的度来提高访问效率,而B+树(B+-tree)便受到了更多的关注。
2.B+树
在传统关系型数据库里,B+树(B+-tree)及其衍生树是被用的比较多的索引树。
B+树的主要特点如下:
(1)每个树节点只放键值,不存放数值,而由叶子节点存放数值。这样会使树节点的度比较大,而树的高度就比较低,从而有利于提高查询效率。
(2)叶子节点存放数值,并按照值大小顺序排序,且带指向相邻节点的指针,以便高效地进行区间数据查询;并且所有叶子节点与根节点的距离相同,
因此任何查询的效率都很相似。
(3)与二叉树不同,B+树的数据更新操作不从根节点开始,而从叶子节点开始,并且在更新过程中树能以比较小的代价实现自平衡。
正是由于B+树的上述优点,它成了传统关系型数据库的宠儿。
当然,它页并非无懈可击,它的主要缺点在于随着数据插入的不断发生,叶子节点会慢慢分裂——这可能会导致逻辑上原本连续的数据实际上存放在不同的物理磁盘块位置上,在做范围查询的时候会导致较高的磁盘IO,以致严重影响到性能。
3.日志结构合并树LSM-tree(Log-Structured Merge-Tree)
众所周知,数据库的数据大多存储在磁盘上,而无论是传统的机械硬盘(HDD Hard Disk Drive)还是固态硬盘(SSD Solid State Drive,SSD),对磁盘数据的顺序读写速度都远高于随机读写。
然而,基于B+树的索引结构是违背上述磁盘基本特点的——它会需要较多的磁盘随机读写,于是1992年名为日志结构(Log-Structured)的新型索引结构方法便应运而生。
日志结构方法的主要思想是将磁盘看做一个大的日志,每次都将新数据和索引结构添加到日志的最末端,以实现对磁盘的顺序操作,从而提高索引性能。
不过日志结构方法也有明显的缺点,随机读取数据时效率很低。
1996年,一篇名为The log-structured merge-tree(LSM-tree)的论文创造性地提出了日志结构合并树(Log-Structured Merge-Tree)的概念,该方法既吸收了日志结构方法的优点,又通过将数据文件预排序克服了日志结构方法随机读性能较差的问题。
直到10年后的2006年谷歌的Bigtable论文使用LSM-Tree技术开始流行。随后2007年的HBase与2008年的Cassandra在LSM-Tree思想基础上诞生,极大推广了LSM-tree技术。
LSM-tree的核心思想是同时使用两部分类树的数据结构来存储数据,并同时提供查询。其中一部分数据结构存在内存缓存(memtable)负责插入更新和读请求,并在内存中进行排序;另一部分写在磁盘(sstable),负责读操作,有序且不能更改。
使用日志文件做数据恢复保障,所有操作记录先写Log,再写memtable,最后冲写到sstable
定期合并小sstable以减少sstable数量,对每个sstable使用布隆过滤器,以加速数据存在与否的判定,从而减少数据的总查询时间。
LSM-tree 显然比较适合那些数据插入操作远多于数据更新删除操作与读操作的场景。同时Druid在一开始就是为时序数据场景设计的,而该场景正好符合LSM-tree的优势特点,因此DRUID架构便顺理成章地吸收了LSM-tree的思想。DRUID采用了类LSM-tree架构。
Druid不提供日志及实行WAL原则 实时节点堆结构缓存区(memtable) 内存非堆区 数据块Segment Split。实时节点会周期性地将磁盘上同一个时间段内生成的所有的数据块合并为一个大的数据块(Segment),这个过程在实时节点中叫作Segment Merge操作也相当于LSM-tree架构中的数据合并操作(Compaction)。合并好的Segment会被传到DeepStorage中。
Druid 高速写入 没有WAL 不适应于数据更新场景,降低了数据完整性的保障。性能方面要更好一些。
------------------------------------------------------------------------
索引
提高数据库查找速度的关键之一是减少磁盘的访问次数,并采用树形结构做索引
二叉查找树和平衡二叉树
二叉查找树在极端非平衡情况下查询效率会退化到O(N),因此尝试采用平衡二叉树;但是平衡二叉树的树高为:
log2 N
树高越高,查询次数越多越慢。同时,每次访问磁盘会读取多个扇区的数据,远大于单个树节点的值,造成浪费
B+树
传统关系型数据库的常用结构。
每个树节点只放键值,不放数值,叶子节点存放数值,使得树高度较低
叶子节点按值大小顺序排序,带指向相邻节点的指针,方便区间数据查询
从叶子节点开始更新,以较小的代价实现自平衡
缺点是随着数据插入,叶子节点会分裂,导致连续数据被存放在不同的物理磁盘块上,导致较大的IO开销
日志结构合并树(LSM)
日志结构的所有方式的将磁盘看做一个大的日志,每次都将新数据和索引结构添加到最末端;LSM通过将数据文件预排序解决了日志结构随机读性能差的问题。
使用两颗树来存储数据,其中一部分数据结构存在内存负责插入更新和读请求,并在内存中进行排序;另一部分写在磁盘,负责读操作,有序且不能更改
使用日志文件做数据恢复保障,所有操作记录先写Log,再写memtable,最后冲写到sstable
定期合并小sstable以减少sstable数量,对每个sstable使用布隆过滤器,以加速数据存在与否的判定
=================================================================================
树的层数和度的概念
层数:根节点为第一层,往下一次递增。
树中节点的最大层数称之为树的深度或者高度,所以在基数为1时树的深度=树的高度=最大层数
但是节点的深度和高度并没有必然的关系
节点的度:节点拥有的子树的个数,度为0的节点称之为叶子节点
树的度:是树内所有节点度的最大值
树的深度:树内所有节点深度的最大值,也就是所有叶子节点深度的最大值,也就是树的层数
树的高度:树内所有节点高度的最大值,也就是根节点的高度,也就是树的层数
节点的度:结点拥有的子树数目称为结点的度,叶子结点 就是度为0的结点
树的度:树内各结点的度的最大值
树的深度与高度
节点 ni 的深度:从根节点到 ni 的的唯一路径长。即,节点 ni 所在的层次(根节点为0层),树的深度 = 树中节点的最大层次。
节点 ni 的高度:从 ni 到一片树叶的最长路径长。即,叶子节点的高度为0,树的高度 = 根的高度。
树的深度 = 树的高度
高度为h的二叉树至少2^h个节点,至多有2^(h+1)-1 个节点。
含有n≥1 个节点的二叉树的高度范围:[ | log2 n」,n-1]
0_1 完全二叉树
只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置。
有 n 个节点的完全二叉树的高度(深度)为 | log2 n」
完全二叉树第 n 层上至多 2^(n+1)个节点
完全二叉树第 n 层上节点编号: 2^n - 2^(n+1)-1
0_2 满二叉树
是一颗完全二叉树;除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层。
第 n 层有 2^(n+1)-1 个节点
深度为k,且有 2^(k+1)-1个节点。
1.二叉排序树(二叉查找树)
左子树上的值都小于根结点的值,右子树上的值都大于根结点得值,左右子树都是二叉排序树。
2.平衡二叉树(ALV)
是一颗二叉排序树;左子树和右子树的高度差值不超过1,左右子树都为平衡二叉树。
插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)
插入操作:在平衡二叉树中插入结点与二叉查找树最大的不同在于要随时保证插入后整棵二叉树是平衡的。那么调整不平衡树的基本方法就是: 旋转,基本思路都是转换到左旋和右旋。
3.红黑树:
与AVL类似,平衡二叉B树,并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
平衡树-B树
B树就是B-树,"-"是个连字符号,不是减号。
B 树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树。(相对于二叉,B树每个内结点有多个分支,即多叉)
B-树是一种平衡的多路查找(又称排序)树,在文件系统中有所应用。主要用作文件的索引。其中的B就表示平衡(Balance)
B树的优势是当你要查找的值恰好处在一个非叶子节点时,查找到该节点就会成功并结束查询,而B+树由于非叶节点只是索引部分,这些节点中只含有其子树中的最大(或最小)关键字,当非终端节点上的关键字等于给点值时,查找并不终止,而是继续向下直到叶子节点。因此在B+树中,无论查找成功与否,都是走了一条从根到叶子节点的路径。
B+树有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了。
B+树支持range-query(区间查询)非常方便,而B树不支持。这是数据库选用B+树的最主要原因。
有很多基于频率的搜索是选用B树,越频繁query的结点越往根上走,前提是需要对query做统计,而且要对key做一些变化。 另外B树也好B+树也好,根或者上面几层因为被反复query,所以这几块基本都在内存中,不会出现读磁盘IO,一般已启动的时候,就会主动换入内存。 mysql底层存储是用B+树实现的,因为内存中B+树是没有优势的,但是一到磁盘,B+树的威力就出来了。
B+树
在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能
根节点和枝节点很简单,分别记录每个叶子节点的最小值,并用一个指针指向叶子节点。
叶子节点里每个键值都指向真正的数据块(如Oracle里的RowID),每个叶子节点都有前指针和后指针,这是为了做范围查询时,叶子节点间可以直接跳转,从而避免再去回溯至枝和跟节点。
B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO。
对于大量的随机写也一样,举一个插入key跨度很大的例子,如7->1000->3->2000 ... 新插入的数据存储在磁盘上相隔很远,会产生大量的随机写IO。
从上面可以看出,低下的磁盘寻道速度严重影响性能(近些年来,磁盘寻道速度的发展几乎处于停滞的状态)。
LSM-Tree
LSM树是HBase里非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。
为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees。
为了更好的说明LSM树的原理,下面举个比较极端的例子:
现在假设有1000个节点的随机key,对于磁盘来说,肯定是把这1000个节点顺序写入磁盘最快,但是这样一来,读就悲剧了,因为key在磁盘中完全无序,每次读取都要全扫描;
那么,为了让读性能尽量高,数据在磁盘中必须得有序,这就是B+树的原理,但是写就悲剧了,因为会产生大量的随机IO,磁盘寻道速度跟不上。
LSM树本质上就是在读写之间取得平衡,和B+树相比,它牺牲了部分读性能,用来大幅提高写性能。
它的原理是把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历所有的小树,但在每颗小树内部数据是有序的。
以上就是LSM树最本质的原理,有了原理,再看具体的技术就很简单了:
1)首先说说为什么要有WAL(Write Ahead Log),很简单,因为数据是先写到内存中,如果断电,内存中的数据会丢失,因此为了保护内存中的数据,需要在磁盘上先记录logfile,当内存中的数据flush到磁盘上时,就可以抛弃相应的Logfile。
2)什么是memstore, storefile?很简单,上面说过,LSM树就是一堆小树,在内存中的小树即memstore,每次flush,内存中的memstore变成磁盘上一个新的storefile。
3)为什么会有compact?很简单,随着小树越来越多,读的性能会越来越差,因此需要在适当的时候,对磁盘中的小树进行merge,多棵小树变成一颗大树。
为什么说B+树比B树更适合数据库索引?
1、 B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
3、由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。
B+树在MyISAM索引实现
叶节点的data域存放的是数据记录的地址
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
B+树在InnoDB索引实现
第一个重大区别是InnoDB的数据文件本身就是索引文件。
从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。
这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
从示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
所以应该注意的地方
为什么不建议使用过长的字段作为主键?
因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
在InnoDB中不要用非单调的字段作为主键。
因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。
=================================================================================
另外一个角度分析树
一、二叉查找树与平衡二叉树
最常见的树结构是二叉查找树(Binary Search Tree),它就是一颗二叉有序树:保证左子树上所有节点的值都小于根节点的值,而右子树上所有
节点的值都大于根节点的值。其优点在于实现简单,并且树在平衡的状态下查找效率能达到O(log2N);缺点是在极端非平衡情况下查找效率会退化到O(N),
因此很难保证索引的效率。
针对上述二叉查找树的缺点,人们很自然就想到是否能用平衡二叉树(Balanced Binary Tree)来解决这个问题。但是平衡二叉树依然有个比较大的问题:它的
树高为log2N——对于索引树来说,树的高度越高,意味着查找所要花费的访问次数就越多,查询效率越低。
况且,主存从磁盘读数据一般以页为单位,因此每次访问磁盘都会读取多个扇区的数据(比如4KB大小的数据),远大于单个二叉树节点的值(字节级别),这也是
造成二叉树相对索引树效率地下的原因。正因如此,人们就想到了通过增加每个树节点的度来提高访问效率,而B+树(B+-tree)便受到了更多的关注。
二、B+树
在传统关系型数据库里,B+树(B+-tree)及其衍生树是被用的比较多的索引树。
B+树的主要特点如下:
(1)每个树节点只放键值,不存放数值,而由叶子节点存放数值。这样会使树节点的度比较大,而树的高度就比较低,从而有利于提高查询效率。
(2)叶子节点存放数值,并按照值大小顺序排序,且带指向相邻节点的指针,以便高效地进行区间数据查询;并且所有叶子节点与根节点的距离相同,
因此任何查询的效率都很相似。
(3)与二叉树不同,B+树的数据更新操作不从根节点开始,而从叶子节点开始,并且在更新过程中树能以比较小的代价实现自平衡。
正是由于B+树的上述优点,它成了传统关系型数据库的宠儿。
当然,它页并非无懈可击,它的主要缺点在于随着数据插入的不断发生,叶子节点会慢慢分裂——这可能会导致逻辑上原本连续的数据实际上存放在不同的物理磁盘块位置上,在做范围查询的时候会导致较高的磁盘IO,以致严重影响到性能。
三、日志结构合并树LSM-tree(Log-Structured Merge-Tree)
众所周知,数据库的数据大多存储在磁盘上,而无论是传统的机械硬盘(HDD Hard Disk Drive)还是固态硬盘(SSD Solid State Drive,SSD),对磁盘数据的顺序读写速度都远高于随机读写。
然而,基于B+树的索引结构是违背上述磁盘基本特点的——它会需要较多的磁盘随机读写,
于是1992年名为日志结构(Log-Structured)的新型索引结构方法便应运而生。
日志结构方法的主要思想是将磁盘看做一个大的日志,每次都将新数据和索引结构添加到日志的最末端,以实现对磁盘的顺序操作,从而提高索引性能。不过日志结构方法也有明显的缺点,随机读取数据时效率很低。
1996年,一篇名为The log-structured merge-tree(LSM-tree)的论文创造性地提出了日志结构合并树(Log-Structured Merge-Tree)的概念,该方法既吸收了日志结构方法的优点,又通过将数据文件预排序克服了日志结构方法随机读性能较差的问题。
直到10年后的2006年谷歌的Bigtable论文使用LSM-Tree技术开始流行。随后2007年的HBase与2008年的Cassandra在LSM-Tree思想基础上诞生,极大推广了LSM-tree技术。
LSM-tree的核心思想是同时使用两部分类树的数据结构来存储数据,并同时提供查询。其中一部分数据结构存在内存缓存(memtable)负责插入更新和读请求,并在内存中进行排序;另一部分写在磁盘(sstable),负责读操作,有序且不能更改。
使用日志文件做数据恢复保障,所有操作记录先写Log,再写memtable,最后冲写到sstable
定期合并小sstable以减少sstable数量,对每个sstable使用布隆过滤器,以加速数据存在与否的判定,从而减少数据的总查询时间。
索引
提高数据库查找速度的关键之一是减少磁盘的访问次数,并采用树形结构做索引
二叉查找树和平衡二叉树
二叉查找树在极端非平衡情况下查询效率会退化到O(N),因此尝试采用平衡二叉树;但是平衡二叉树的树高为:
log2 N
树高越高,查询次数越多越慢。同时,每次访问磁盘会读取多个扇区的数据,远大于单个树节点的值,造成浪费
B+树
传统关系型数据库的常用结构。
每个树节点只放键值,不放数值,叶子节点存放数值,使得树高度较低
叶子节点按值大小顺序排序,带指向相邻节点的指针,方便区间数据查询
从叶子节点开始更新,以较小的代价实现自平衡
缺点是随着数据插入,叶子节点会分裂,导致连续数据被存放在不同的物理磁盘块上,导致较大的IO开销
日志结构合并树(LSM)
日志结构的所有方式的将磁盘看做一个大的日志,每次都将新数据和索引结构添加到最末端;LSM通过将数据文件预排序解决了日志结构随机读性能差的问题。
使用两颗树来存储数据,其中一部分数据结构存在内存负责插入更新和读请求,并在内存中进行排序;另一部分写在磁盘,负责读操作,有序且不能更改
使用日志文件做数据恢复保障,所有操作记录先写Log,再写memtable,最后冲写到sstable
定期合并小sstable以减少sstable数量,对每个sstable使用布隆过滤器,以加速数据存在与否的判定
相关推荐
- 数据结构包括队列、集合、链表、数组、字典、关联数组、栈和各种类型的树(如二叉树、完全二叉树、平衡二叉树、BST、红黑树、B-、B+、B*树和LSM树)。 - 常用算法有排序(如选择、冒泡、插入、快速、归并、希尔...
区块链_智能合约_Solidity_保险应用_基于以太坊的技_1744433266
内容概要:本文档详细介绍了在Windows系统上安装MySQL数据库的具体步骤。首先,需要配置系统环境变量,包括新建MYSQL_HOME变量并将其添加到PATH中;其次,创建并编辑my.ini配置文件,设置MySQL的基本参数如端口、字符集、数据存放目录等;接着,在命令行工具中通过一系列指令完成MySQL的初始化、服务安装、启动以及root用户的密码设置和权限调整。整个流程涵盖了从环境搭建到最终确保MySQL服务正常运行的所有关键环节。 适合人群:适用于有一定计算机操作基础,尤其是对数据库管理有一定兴趣或需求的技术人员。 使用场景及目标:①帮助用户在本地机器上成功部署MySQL数据库环境;②确保用户能够掌握MySQL的基本配置与管理技能,如环境变量配置、服务安装与卸载、用户权限管理等。 其他说明:在安装过程中可能会遇到一些常见问题,例如由于之前版本残留导致的服务安装失败,此时可以通过命令行删除旧服务(sc delete mysql)来解决。此外,为了保证安全性,务必及时修改root用户的初始密码。
内容概要:`STARTUP.A51` 是 Keil C51 编译器自带的启动文件,用于初始化 8051 单片机的硬件和软件环境。该文件主要完成三个任务:初始化堆栈指针、清零内部数据存储器、跳转到主程序。文件中定义了内存模式(如 SMALL),并设置了堆栈指针的初始值为 0x60。接着通过循环将内部数据存储器的所有字节清零,确保程序开始时数据存储器的状态是确定的。此外,文件还列出了 8051 单片机的各个中断向量地址,并为每个中断提供占位符,实际的中断处理程序需要在其他文件中实现。最后,启动代码段初始化堆栈指针和数据段后,跳转到 `MAIN` 函数开始执行主程序。; 适合人群:对嵌入式系统开发有一定了解,尤其是使用 8051 单片机的开发者。; 使用场景及目标:①理解 8051 单片机启动文件的工作原理;②掌握如何初始化堆栈指针和数据段;③熟悉中断向量表的设置及其作用。; 其他说明:此文件为程序正常运行提供了必要的初始化操作,开发者可以根据具体需求修改该文件以适应不同的硬件和软件环境。
内容概要:该论文研究了一种基于行波理论的输电线路故障诊断方法。当输电线路发生故障时,故障点会产生向两侧传播的电流和电压行波。通过相模变换对三相电流行波解耦,利用解耦后独立模量间的关系确定故障类型和相别,再采用小波变换模极大值法标定行波波头,从而计算故障点距离。仿真结果表明,该方法能准确识别故障类型和相别,并对故障点定位具有高精度。研究使用MATLAB进行仿真验证,为输电线路故障诊断提供了有效解决方案。文中详细介绍了三相电流信号生成、相模变换(Clarke变换)、小波变换波头检测、故障诊断主流程以及结果可视化等步骤,并通过多个实例验证了方法的有效性和准确性。 适合人群:具备一定电力系统基础知识和编程能力的专业人士,特别是从事电力系统保护与控制领域的工程师和技术人员。 使用场景及目标:①适用于电力系统的故障检测与诊断;②能够快速准确地识别输电线路的故障类型、相别及故障点位置;③为电力系统的安全稳定运行提供技术支持,减少停电时间和损失。 其他说明:该方法不仅在理论上进行了深入探讨,还提供了完整的Python代码实现,便于读者理解和实践。此外,文中还讨论了行波理论的核心公式、三相线路行波解耦、行波测距实现等关键技术点,并针对工程应用给出了注意事项,如波速校准、采样率要求、噪声处理等。这使得该方法不仅具有学术价值,也具有很强的实际应用前景。
内容概要:本文详细介绍了光伏-混合储能微电网能量管理系统的模型架构及其控制策略。首先探讨了光伏发电模块中的MPPT(最大功率点跟踪)控制,采用扰动观察法和改进型变步长策略来提高光伏板的发电效率。接着重点讲解了混合储能系统的功率分配,利用一阶低通滤波算法将功率需求分为低频和高频两部分,分别由蓄电池和超级电容处理。此外,文中还深入讨论了SOC(荷电状态)管理策略,确保电池和超级电容在不同工作状态下保持最佳性能。仿真结果显示,在光伏出力剧烈波动的情况下,系统能够有效地维持稳定的电压水平,并显著提高了储能设备的使用寿命。 适合人群:对光伏微电网、储能技术和能量管理系统感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于研究和开发高效、可靠的光伏-混合储能微电网系统,旨在优化能量管理和提高系统稳定性。具体应用场景包括但不限于家庭光伏系统、小型微电网以及工业能源管理系统。 其他说明:文中提供了详细的代码实现和仿真结果,便于读者理解和复现实验。同时,模型设计采用了模块化思路,方便进行个性化修改和扩展。
内容概要:本文详细介绍了基于MATLAB和CVX平台实现的储能调峰调频联合优化模型。该模型不仅涵盖了储能的基本参数设定、负荷不确定性处理、充放电策略制定,还包括了调峰调频的联合调度、功率约束处理、鲁棒优化等方面的内容。通过构建考虑电池退化成本、充放电功率约束以及用户负荷不确定性的储能优化模型,展现了储能系统在电力系统中的高效协同工作。文中提供了详细的代码示例,解释了各个部分的功能和实现方法,强调了模型的深度与创新性。 适合人群:适用于具有一定编程基础和技术背景的研究人员、工程师以及希望深入了解储能系统优化的学生。 使用场景及目标:该模型主要用于电力系统中储能设备的优化调度,旨在提高储能系统的经济效益和社会效益。通过联合调峰调频,能够显著提升储能系统的收益,实现1+1>2的超线性增益效果。此外,该模型还可以用于教学和科研,帮助初学者理解和掌握储能优化的相关技术和理论。 其他说明:代码中包含了丰富的注释和模块化的子程序,使得整个模型易于理解和扩展。对于有经验的开发者,可以在现有基础上进一步改进和定制,以适应不同的应用场景。
大模型技术白皮书2023版
图像增广 PyTorch 版
批量修改文件名可以帮助用户节省大量时间,提高工作效率 里面附带使用教程
《计算机应用基础》第2章--Windows-XP操作系统.ppt
包括:源程序工程文件、Proteus仿真工程文件、电路原理图文件、配套技术手册、论文资料等 1、采用51/52单片机(通用)作为主控芯片; 2、采用1602液晶显示使用过程及状态,液晶屏亮度会随光线自动调整; 3、按键输入6位密码,输入密码正确则锁打开,显示open!输入密码错误次数超过3次,蜂鸣器报警并且锁定键盘; 4、密码可以自己修改,必须是锁打开时才能改密,为防止误操作,修改密码得输入两次; 5、采用24C02保存密码,掉电不丢失; 6、可通过红外遥控器输入密码操作锁的状态;
内容概要:本文深入剖析了2025年全球感知技术的十大发展趋势,涵盖多模态感知融合、3D感知与空间计算、脑机接口中的感知反馈技术、5G/6G赋能的超低延迟感知、语音与情感识别的高级化、生物感知与数字健康、环境感知与自适应智能、增强现实(AR)与触觉反馈技术、气味与化学感知、量子感知与极端条件测量。文章详细介绍了每项技术的技术原理、关键算法、实现方式、商业案例及未来前景,强调了感知技术在智慧城市、自动驾驶、智慧医疗、工业自动化等领域的深刻影响。报告指出,感知技术正从单一传感模式向多模态融合、从二维数据向三维空间重建、从传统网络通信向超低延迟和高可靠性网络升级,实现全场景、全维度的智能感知。; 适合人群:对感知技术感兴趣的科技爱好者、研究人员、决策者、企业管理层和投资人。; 使用场景及目标:①了解感知技术的最新进展和未来发展方向;②为技术研究提供全面、深入的参考;③为商业应用提供具体的案例和前景分析;④推动跨领域协同创新,构建开放共赢的产业生态。; 其他说明:报告基于近年来技术研发的最新进展、业界前沿的技术路线以及各大科技企业在商业落地方面的丰富实践。随着感知技术的不断成熟,数据隐私与安全保护问题也需高度重视,以确保技术进步与社会伦理和谐统一。未来,感知技术将成为推动社会进步和产业升级的重要力量,为实现万物互联、智慧决策和智能体验提供无限可能。
本论文主要论述了如何使用JAVA语言开发一个校园新闻网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述校园新闻网站的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 校园新闻网站的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、新闻类型管理、校园新闻管理、留言板管理、论坛交流、系统管理,用户前台:首页、校园新闻、论坛交流、留言反馈、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个校园新闻网站信息管理的过程得以实现。 本系统的使用可以实现本校园新闻网站管理的信息化,可以方便管理员进行更加方便快捷的管理,可以提高管理人员的工作效率。 基于Springboot+vue的校园新闻网站【源码+数据库+参考论文】 感兴趣自行下载学习!
内容概要:本文详细探讨了三相三电平PWM整流器的闭环控制策略及其核心技术——三电平SVPWM算法。文章首先介绍了三相三电平PWM整流器的基本概念和优势,如输出三种电平以降低谐波含量并减少滤波器体积和成本。接着阐述了闭环控制策略的重要性,强调了电压外环和电流内环的双闭环控制机制。随后,文章深入讲解了三电平SVPWM算法的工作原理,包括空间电压矢量的选择、扇区判断、矢量作用时间和死区补偿等关键技术环节。此外,还讨论了中点电位平衡的问题以及PI参数的整定方法。最后,通过示波器测试验证了系统的性能指标,如THD低于3%,直流电压纹波小于1%。 适合人群:从事电力电子领域的工程师和技术人员,尤其是对三相三电平PWM整流器及其控制策略感兴趣的读者。 使用场景及目标:适用于高压大功率场合,旨在提高整流器的性能,降低谐波含量,实现单位功率因数运行。通过合理设计闭环控制策略和优化SVPWM算法,确保整流器在各种工况下都能稳定、高效地工作。 其他说明:文中提供了大量MATLAB和C语言代码片段,帮助读者更好地理解和实现相关算法。同时,针对实际调试过程中遇到的问题给出了实用的解决方案,如中点电位平衡和死区补偿等。
全新红娘本地交友系统定制版源码 相亲婚恋交友小程序源码
内容概要:文章探讨了AI技术,特别是DeepSeek,如何驱动地图生成的变革。首先介绍了地图制图在AI时代的背景与挑战,强调了DeepSeek与地图融合的两种主要方式:嵌入地图制图链和研发地图语言自身的预训练模型。随后详细描述了DeepSeek在地图生成中的具体应用,包括智能化地图生成器DoMapAI的整体框架,地图制图链中的知识图谱推理路径,以及地图语言的Token化过程。最后,文章总结了AI时代地图制图的职业变化和技术变革,指出地图制图正经历“大变局”。 适合人群:从事地图制图及相关领域的研究人员、工程师,以及对AI与地图生成感兴趣的学者。 使用场景及目标:①理解AI技术在地图生成中的应用,特别是DeepSeek的作用;②掌握智能化地图生成器DoMapAI的工作原理及其应用场景;③学习地图语言Token化的方法及其在地图生成中的应用;④探索AI时代地图制图的职业发展方向和技术变革。 阅读建议:本文内容较为专业,建议读者先了解基本的AI技术和地图制图知识。重点关注DeepSeek与地图融合的具体方法和应用场景,理解智能化地图生成器DoMapAI的工作流程,以及地图语言Token化的实现过程。在阅读过程中,可以结合实际案例进行思考,以更好地理解AI技术对地图制图的影响。
chromedriver-mac-arm64-135.0.7049.114.zip
《网络布线与小型局域网搭建(第2版)》第3章-布线系统的设计.ppt
内容概要:本文详细介绍了使用Abaqus软件进行子弹穿钢板模型的模拟方法,重点探讨了CAE文件的作用和创建过程。首先概述了子弹穿钢板模拟的重要性和应用场景,接着深入讲解了CAE文件的概念及其作为模拟‘大脑’的关键地位。文中提供了详细的Python代码示例,涵盖创建部件、定义材料属性、划分网格、设置接触条件以及显式动力学分析步骤等方面的内容。此外,还讨论了网格划分的艺术、接触设置的注意事项、求解器参数的选择以及后处理技巧,强调了每个环节的具体操作和优化建议。 适合人群:从事工程模拟领域的研究人员和技术人员,尤其是对Abaqus软件有一定了解并希望深入掌握其高级特性的用户。 使用场景及目标:适用于需要模拟高速冲击条件下材料行为的研究项目,如防护材料研发、结构抗冲击设计等。通过学习本文,读者能够掌握创建复杂工程模拟模型的方法,提高模拟效率和准确性。 其他说明:文章不仅提供了理论指导,还包括大量实用的操作提示和代码片段,有助于读者快速上手并在实践中不断改进模型。同时,文中提到的一些优化技巧对于提升计算性能和结果可靠性具有重要价值。