xarray 简易体会与实现

1 基础原理

xarray1主要由 xarray 结点组成,xarray 结点主要由槽位(即指针)、父节点指针等组成。xarray 根据整型索引组织 xarray 结点实现对目标值的高效存、查、删操作。
在这里插入图片描述
此文以

  • 存查删等流程对应源码2
  • 具体实例 —— xarray 结点槽位数 64,索引及目标值对(0, y 0 y_0 y0)、(1, y 1 y_{1} y1)、(4095, y 4095 y_{4095} y4095)
    方式体会 xarray 基础原理。

1.1 存查删

在一个空 xarray 中依次新增 (0, y 0 y_0 y0)、(1, y 1 y_1 y1) 得如下图示。
在这里插入图片描述
索引 0 和 1 对应目标值分别由同一结点的 0 和 1 槽位指向。体会源码中规律,范围索引 [0…63] 对应目标值都将由该结点依次指向,此时 xarray 层级高度为 1,只有叶子结点。

续增 (4095, y 4095 y_{4095} y4095) 图示如下。
在这里插入图片描述
通过续增 (4095, y 4095 y_{4095} y4095) 后可得出 xarray 新增元素大概分以下几步

  • 根据索引计算层级高度,若新索引对应层级高度超过原层级高度,则分配新顶层结点,并建立与原顶层结点的父子关系
  • 分配子结点并与其上层结点建立父子关系,直到在叶子结点上将目标值映射到相应槽位上

4095 是层级高度为 2 的 xarray 能容纳的最大索引 —— 当新增 (64, y 64 y_{64} y64)时,xarray 的层级高度就会被扩展为 2。

根据索引查询目标值与新增过程遵循相同规则。如查询索引 4095, 64 对应目标值的流程分别为如下图示。
在这里插入图片描述
现将上文根据源码结合特殊例子对 xarray 的体会加以总结。此文认为 xarray 根据索引映射目标值涉及以下要点

  • xarray 结点层级高度
  • 索引在 xarray 各层级结点的槽位号

即对于任意整型索引 i n d e x x index_x indexx 与 xarray 结点层级高度 l e v e l s levels levels 和在各层槽位号 s l o t o f C u r r e n t X N o d e slot_{ofCurrentXNode} slotofCurrentXNode 的规则为

  • l e v e l s = l o g s l o t s m a x ( i n d e x x , i n d e x M a x o f X a r r a y ) levels=log_{slots}max(index_x,index_{MaxofXarray}) levels=logslotsmax(indexx,indexMaxofXarray)
  • s l o t o f C u r r e n t X N o d e = ( i n d e x x > > ( l o g 2 s l o t s ∗ l e v e l o f C u r r e n t X N o d e ) ) m o d s l o t s slot_{ofCurrentXNode}=(index_x >> (log_2slots * levelofCurrentXNode))\quad mod \quad slots slotofCurrentXNode=(indexx>>(log2slotslevelofCurrentXNode))modslots

其中的 s l o t s slots slots 为 xarray 结点槽位数,这便是 xarray 根据索引值映射目标值的基础规则。

最后来看看删除,xarray 删除可以看作由查询和收缩两个流程组成。收缩指删除某目标值后尝试释放 xarray 结点的过程 —— 让 xarray 恢复到插入该目标值前的样子。

以删除上文索引 4095 为例作如下图示。
在这里插入图片描述

删除索引 4095 后,整个 xarray 恢复到了插入索引 4095 前即插入索引 [0…1] 之后的样子。

结点删除条件为

  • 结点(包括顶层结点)槽位全为空闲
  • 顶层结点只有 0 槽位非空闲

1.2 多索引

xarray 的多索引是指能用多个索引映射同一个目标值。其基础原理是:索引以“多索引数”向下对齐。如选择多索引数为 2 o r d e r 2^{order} 2order 时,则任意索引 i n d e x x index_x indexx 在各结点上所将映射槽位号为
s l o t o f C u r r e n t X N o d e = ( ( i n d e x x m o d 2 o r d e r ) > > ( l o g 2 s l o t s ∗ l e v e l o f C u r r e n t X N o d e ) ) m o d s l o t s slot_{ofCurrentXNode}=((index_x \quad mod \quad 2^{order})>> (log_2slots * levelofCurrentXNode))\quad mod \quad slots slotofCurrentXNode=((indexxmod2order)>>(log2slotslevelofCurrentXNode))modslots

1.3 新遍历

遍历是指逐一迭代出所有叶子结点上目标值的过程。从顶层结点开始逐一遍历子 xarray 是一个比较直观的实现方法,该方法是一个递归过程。

考虑具体实现的简单性,此文提倡

  • 找到 xarray 最大索引 i n d e x m index_m indexm
  • 查询索引范围 [0, i n d e x m index_m indexm] 对应目标值
    来实现遍历 —— 如此遍历就复用了查询流程。

以 xarray 各层级结点最右侧有值槽位向下层索引子结点方式可找到 xarray 中的最大索引。
在这里插入图片描述

寻找最大索引所需遍历最大次数将趋近等于层级高度乘以槽位数。如 xarray 结点槽位为 64,层级高度为 5 时,最大索引遍历次数趋近为 320 = 5 * 643

得到 xarray 中的最大索引后,遍历就变成了对范围索引 [ 0 , i n d e x m ] [0, index_m] [0,indexm] 的连续查询。

2 优劣浅析

  • 对聚集型索引,xarray 比诸如哈希或二叉树更具缓存友好性4,动态扩展比动态数组具更高效率5
  • xarray 有多叉树特色,容纳相同数据量时层级高度比二叉树低,所以其增、查、删的平均效率比二叉树高6,另外 xarray 的增、删操作的内部自平衡比二叉树内部自平衡简单
  • xarray 结点更可能7比二叉树结点复杂,由此容纳相同数据量时可能会占用更多内存
  • xarray 应用场景不如二叉树丰富,其适用于具(连续)整型索引场景

如果其中优劣在实际中不是问题,则可忽略随意选择。

3 简易实现

如何有效发现上述篇幅描述是否有误呢8? —— 按照以上描述简易实现一个 xarray,正好内核版本中 xarray 源码不能直接拷贝到用户空间使用9

  • xarray.c
  • xarray.h

除 xarray 基础原理相关代码外,此文还为其编码了结点缓存相关代码,用于加持 xarray 的快速性。

  • pageca.c
  • pageca.h
  • memca.c
  • memca.h

  1. xarray 是 Linux radix tree 的替代者 ↩︎

  2. linux-6.14/lib/xarray.c ↩︎

  3. 实际遍历最大次数应当是第 5 层第一个索引出现时即 318 = 3 * 64 + 2 * 63,可忽略,大多数情况无需处理到如此细腻层次 ↩︎

  4. 相邻索引操作涉及访问 xarray 相同结点,而 hash/rbtree 尤其是hash 往往不具该特色 ↩︎

  5. xarray 不用丢掉旧内存而把旧值复制到新值上,MMU 地址映射关系也不用全部更新 ↩︎

  6. 如当 xarray 结点槽位数为 64,存 2GiB 数据时,xarray 层级高度为 5,二叉树层级高度为 30 ↩︎

  7. xarray 能容纳其他功能,所以可能需要结点中包含更多的成员来支撑;如果能够精简 xarray 结点的实现,xarray 结点也不一定比二叉树结点复杂 ↩︎

  8. 夸夸其谈半天好像已经懂完了一样 ↩︎

  9. 最大的阻碍应该是内核使用 xarray 结点地址低 2 位用作了判断该结点是否位中间结点等用途 —— 内核可保证低所分配地址以 4 字节对齐,而用户程序中的内存分配不能保证。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/91964.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

E8—Aurora 64/66B ip实现GTX与GTY的40G通信2023-08-12

1. 场景 要在贴有K7系列FPGA芯片的板子和贴有KU系列FPGA芯片的板子之间通过光模块光纤QSFP实现40G的高速通信。可以选择的方式有多种,但本质的方案就一种,即实现4路GTX与GTY之间的通信。可以选择8B/10B编码通过GT IP核实现,而不能通过Aurora…

深入探索:解读创意的力量——idea的下载、初步使用

目录 ​编辑 1.IDEA的简介 2.IDEA的下载 2.1下载路径https://www.jetbrains.com/zh-cn/idea/download/?sectionwindows​编辑​ 2.2下载的步骤 3 idea的初步使用 3.1新建一个简单的Java项目 3.1.1首先需要创建一个新的工程 3.1.2创建一个新的项目(模块&am…

Spring项目整合过滤链模式~实战应用

代码下载 设计模式代码全部在gitee上,下载链接: https://gitee.com/xiaozheng2019/desgin_mode.git 日常写代码遇到的囧 1.新建一个类,不知道该放哪个包下 2.方法名称叫A,干得却是A+B+C几件事情,随时隐藏着惊喜 3.想复用一个方法,但是里面嵌套了多余的逻辑,只能自己拆出来…

WPS-0DAY-20230809的分析和利用复现

WPS-0DAY-20230809的分析和初步复现 一、漏洞学习1、本地复现环境过程 2、代码解析1.htmlexp.py 3、通过修改shellcode拿shell曲折的学习msf生成sc 二、疑点1、问题2、我的测试测试方法测试结果 一、漏洞学习 强调:以下内容仅供学习和测试,一切行为均在…

使用wxPython和PyMuPDF提取PDF页面指定页数的内容的应用程序

在本篇博客中,我们将探讨如何使用wxPython和PyMuPDF库创建一个简单的Bokeh应用程序,用于选择PDF文件并提取指定页面的内容,并将提取的内容显示在文本框中。 C:\pythoncode\new\pdfgetcontent.py 准备工作 首先,确保你已经安装了…

【Python机器学习】实验10 支持向量机

文章目录 支持向量机实例1 线性可分的支持向量机1.1 数据读取1.2 准备训练数据1.3 实例化线性支持向量机1.4 可视化分析 实例2 核支持向量机2.1 读取数据集2.2 定义高斯核函数2.3 创建非线性的支持向量机2.4 可视化样本类别 实例3 如何选择最优的C和gamma3.1 读取数据3.2 利用数…

服务器遭受攻击之后的常见思路

哈喽大家好,我是咸鱼 不知道大家有没有看过这么一部电影: 这部电影讲述了男主是一个电脑极客,在计算机方面有着不可思议的天赋,男主所在的黑客组织凭借着超高的黑客技术去入侵各种国家机构的系统,并引起了德国秘密警察…

springcloud3 使用openfegin实现getpost请求调用

一 项目介绍 1.1 工程介绍 1.consumer9008 2.provider9009 二 get请求 2.1 消费端 1.controller 2.service 2.2 提供者 1.提供者 2.3 测试请求 地址: http://localhost:9008/consumer/payment/nacos/2223 三 post请求 3.1 消费者 3.2 提供者 3.3 测试请求…

C++的stack和queue+优先队列

文章目录 什么是容器适配器底层逻辑为什么选择deque作为stack和queue的底层默认容器优先队列优先队列的模拟实现stack和queue的模拟实现 什么是容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结),…

R语言实现计算净重新分类指数(NRI)和综合判别改善指数(IDI)

两个模型比较,与第一个模型相比,NRI(重新分对的 - 重新分错的)/总人数。IDI(新模型患者平均预测概率-旧模型患者平均预测概率)-(新模型非患者平均预测概率-旧模型非患者平均预测概率&#xff09…

Kafka第一课概述与安装

生产经验 面试重点 Broker面试重点 代码,开发重点 67 章了解 如何记录行为数据 1. Kafka概述 1.产生原因 前端 传到日志 日志传到Flume 传到HADOOP 但是如果数据特比大,HADOOP就承受不住了 2.Kafka解决问题 控流消峰 Flume传给Kafka 存到Kafka Hadoop 从Kafka…

IDE的下载和使用

IDE 文章目录 IDEJETBRAIN JETBRAIN 官网下载对应的ide 激活方式 dxm的电脑已经把这个脚本下载下来了,脚本是macjihuo 以后就不用买了

系列六、Redis中的五大数据类型及相关操作

一、五大数据类型 String类型、List类型、Set类型、ZSet类型、hash类型。 二、String类型 2.1、内存储存模型 2.2、常用操作命令 三、List类型 3.1、概述 list列表,相当于Java中的list集合。特点:元素有序 且 可以重复。 3.2、内存存储模型 3.3、常用…

“粤”动扬帆,共赢数安|2023百城巡展走进广深双城

新起点新战略共赢数安蓝海 2023美创科技百城巡展之旅如火如荼 持续赋能区域合作伙伴 8月10-11日,美创科技相继走进广州、深圳。作为2023年百城巡展之行的重要区域,美创为合作伙伴带来最新渠道政策解读,行业机会点及新产品新方案分享&#…

AIGC绘画:基于Stable Diffusion进行AI绘图

文章目录 AIGC深度学习模型绘画系统stable diffusion简介stable diffusion应用现状在线网站云端部署本地部署Stable Diffusion AIGC深度学习模型绘画系统 stable diffusion简介 Stable Diffusion是2022年发布的深度学习文本到图像生成模型,它主要用于根据文本的描述…

ChatGPT or BingChat

你相信我们对大模型也存在「迷信权威」吗? ChatGPT 的 GPT-4 名声在外,我们就不自觉地更相信它,优先使用它。但我用 ChatALL 比较 AI 大模型们这么久,得到的结论是: ChatGPT GPT-4 在大多数情况下确实是最强&#xf…

SSM整合(XML方式)

文章目录 SSM整合之后xml方式1 系统环境1.1 软件环境1.2 项目环境1.3 配置web.xml1.4 配置jdbc.properties文件1.5 配置SpringMVC核心文件1.6 配置Spring的核心文件1.7 配置MyBatis的核心文件1.8 配置数据库1.9 配置文件位置 2 编写后端代码2.1 编写实体类2.2 编写Dao接口2.3 编…

Postman接口自动化测试实战,从0到1一篇彻底打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 postman中的测试 …

【设计模式】责任链模式

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者…

SegFormer之模型训练

单卡训练,所有配置文件里的【SyncBN】改为【BN】 启动训练 (1)终端直接运行 python tools/train.py local_configs/segformer/B1/segformer.b1.512x512.ade.160k.py (2)在编辑器中运行 在 [config] 前面加上’–‘将…