xarray 简易体会与实现

news2025/1/23 4:55:55

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.coloradmin.cn/o/883049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Databend 开源周报第 106 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 数据脱敏 Data…

spring Initializr快速创建项目

spring Initializr快速创建项目 创建创建完成后 创建 勾选依赖 创建完成后

【2022吴恩达机器学习课程视频翻译笔记】3.3代价函数公式

忙了一阵子,回来继续更新 3.3 代价函数公式 In order to implement linear regression. The first key step is first to define something called a cost function. This is something we’ll build in this video, and the cost function will tell us how well…

SMART PLC 64位双精度浮点数转32位单精度浮点数(Double_TO_Float)

有关博途PLC对位、字节、字元素的拆分和合并,请参看下面文章链接: 博途PLC 位/字/字节 Bit/ Word/Byte拆分与合并_博途的bit_RXXW_Dor的博客-CSDN博客有时候我们需要将分散分布的开关量信号组合为一个整体比如一个字节再完成发送,或者一些报警联锁控制,组合为一个字方便触…

原型模式 Prototype Pattern 《游戏编程模式》学习笔记

原型的定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 举个例子 假设我现在要做一款游戏,这个游戏里有许多不同种类的怪物,鬼魂,恶魔和巫师。这些怪物通过“生产者”进入这片区域,每种敌人…

VR/AR眼镜方案,MTK联发科平台智能眼镜安卓主板设计方案

随着人工智能在不同领域的逐渐深入,人们对一款产品的需求不再局限于某种单一的功能或单一场景,尤其是在工业医疗等专业领域,加快数字化转型才能实现产业的升级。 AR智能眼镜,是一个可以让现场作业更智能的综合管控设备。采用移动…

实验三 图像分割与描述

一、实验目的: (1)进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。 (2)掌握图像分割方法,熟悉常用图像描述方法。 二、实验原理 1.肤色检测 肤色是人类皮肤重要特征之一&#xff…

Springboot 实践(4)swagger-ui 测试controller

前文项目操作,完成了项目的创建、数据源的配置以及数据库DAO程序的生成与配置。此文讲解利用swagger-ui界面,测试生成的数据库DAO程序。目前,项目swagger-ui界面如下: 以”用户管理”为例,简单讲述swagger-ui测试数据库…

家纺行业小程序商城搭建指南

家纺行业作为一个不可或缺的消费领域,近年来备受关注。随着互联网的发展,小程序商城成为家纺行业拓展市场的新利器。搭建一个家纺行业小程序商城并不是一件困难的事情,只需要按照以下几个步骤进行操作,就能轻松上手。 首先&#x…

软件测试52讲-学习笔记

测试基础知识篇(11讲) 01 你真的懂测试吗?从“用户登录”测试谈起 测试用例设计框架 基于功能性需求和非功能性需求思考: 功能性需求使用等价类划分、边界值分析、错误推断法设计用例 非功能性需求考虑安全(信息的保存…

Postgresql源码(112)plpgsql执行sql时变量何时替换为值

相关 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 《Postgresql源码(49)plpgsql函数编译执行流程分析总结》 《Postgresql源码(5…

【每日一题】—— B - Who is Saikyo?(AtCoder Beginner Contest 313)

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

线性表,双向链表,静态链表,循环链表(约瑟夫环)

目录 什么是线性表(线性存储结构) 顺序存储结构和链式存储结构 前驱和后继 顺序表(顺序存储结构)及初始化详解 顺序表的初始化 双向链表及创建(C语言)详解 双向链表的创建 静态链表及其创建&#x…

Ant Design Mobile是什么?

在当今的数字时代,移动应用程序和网页设计已经成为各行各业的重要组成部分。用户界面的设计直接影响到用户体验和产品的成功。为了帮助设计师在移动设计领域更好,Antdesignmobile应运而生。Antdesignmobile是蚂蚁金服的移动UI设计语言和框架,…

Android进阶之多级列表

遇到一个需求需要显示多级列表,因为界面是在平板上的,所以层级是从左向右往下排的,类似于 我当时的写法是在xml布局里一个个RecyclerView往下排的 当然前提是已经规定好最大的层级我才敢如此去写界面,如果已经明确规定只有两级或…

回归预测 | MATLAB实现GRNN广义回归神经网络多输入多输出预测

回归预测 | MATLAB实现GRNN广义回归神经网络多输入多输出预测 目录 回归预测 | MATLAB实现GRNN广义回归神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现GRNN广义回归神经网络多输入多输出预测,输入10个特征&#x…

每日一题——合并二叉树

题目 已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如: 两颗二叉树是: Tree 1 Tree 2 合并后的树为 数据范围:树上节点数…

【笔试题心得】排序算法总结整理

排序算法汇总 常用十大排序算法_calm_G的博客-CSDN博客 以下动图参考 十大经典排序算法 Python 版实现(附动图演示) - 知乎 冒泡排序 排序过程如下图所示: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻…

快速入门vue3组合式API

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 使用create-vue创建项目 1. 前提环境条件 已安装 16.0 或更高版本的 Node.js node -v 2. 创建一个Vue应用 npm…

第三章nginx详解

nginx:高性能,轻量级的web服务软件。 特点: 1,稳定性高。(没有apache稳定) 2,系统资源消耗地较低。(处理http请求的并发能力非常高,单台物理服务器可以处理30000-5000…