学术加油站|HIST,面向海量数据的学习型多维直方图

news2024/12/28 18:31:14

编者按

本文系东北大学李俊虎所著,也是「 OceanBase 学术加油站」系列第九篇内容。

「李俊虎:东北大学计算机科学与工程学院在读硕士生,课题方向为数据库查询优化,致力于应用 AI 技术改进传统基数估计器,令数据库选择最优查询计划。」

今天分享的主题是 《HIST,面向海量数据的学习型多维直方图》,从学习型索引方法的 RMI 模型借鉴了结构设计,并在此之上提出了学习型多维直方图,即 LHIST (Learned Histogram) 模型,用于基数估计的学习型数据概要方法。希望阅读完本文,你可以对这个话题有新的收获,有不同看法也欢迎在底部留言探讨。

*原文"LHist : Towards Learning Multi-dimensional Histogram for Massive Spatial Data",发表于 ICDE 2021,可点击文末“阅读全文”下载全篇论文查看。


 

多维直方图 (Multi-dimensional histogram, MH) 技术被广泛用于查询的基数估计,空间数据分片,空间数据挖掘等方向。然而,目前的 MH 方法存在以下缺陷:

  • 不合理的假设: 为了减少空间代价,MH 和其它的数据摘要方法一样需要随机采样过程,这极度依赖 dimension-wise independence 或者 intra-bucket uniform distribution 两个理想化的假设。

  • 不稳定的性能: 目前已有的 MH 方法的估计效果很容易受不同数据集的影响,参数设置,查询负载等。已经有研究证明了 MH 的高准确率需要更高的存储代价。

受最近提出的学习型索引模型的启发,比如 RMI 模型 [1]通过集成简单的机器学习模型改进广泛使用的 B-tree 索引结构。本文从学习型索引方法的 RMI 模型借鉴了结构设计,并在此之上提出了能解决上述两种缺陷的学习型多维直方图,即 LHIST (Learned Histogram) 模型,它是一个完全由数据驱动的,可用于基数估计的学习型数据概要方法。LHIST 模型的设计有两方面:

第一,可描述复杂多维直方图的累计密度函数 CDF。

第二,能很好地平衡内存和准确率两项指标。

实验证明 LHIST 在存储成本,查询处理效率和精度方面都要优于传统的数据概要方法。

 

问题定义

 

数据点 Point:一个向量 x = (x(1), x(2),…, x(d)) 是一个欧几里得空间,其中 x(i)表示向量 x 的第 i 维元素。

超矩形 Hyper-rectangle:一个超矩形可被符号化定义,如下

 

Image

公式 1 超矩形定义

 

超矩形解析自查询语句,每个数组表示了谓词的覆盖区间,比如 age > 18 AND age < 24 可以被解析为 [18, 24]。使用 X 表示空间数据集,则 X ∩ R 表示某个查询所覆盖到的数据空间,| X ∩ R | 则表示该查询的 COUNT 结果 (或者称之基数)。

学习型空间概要 Learned Spatial Synopsis:定义一个函数 f ,它接受 R 作为输入,并输出 |X ∩ R|。

 

学习型索引RMI

 

本文的模型结构借鉴于[1]提出的 RMI ( Recursive Model Index ),它是一个学习型索引模型,用于挖掘键值 key 以及排序索引位置 idx(key) 的关系。RMI 是一个层次结构 (而非树形结构),当输入 key 值时,模型会依据自身结构自上而下地进行搜索,并在叶子节点返回预测的索引位置 idx(key)。

更具体来讲,每一层 stage 的模型会预测 key 值的索引位置范围,并据此决定继续传递给下一层 stage 的哪个模型。越靠近底层的模型越能给出更加精确的预测,缩小搜索范围。显然,RMI 模型本身由多个小型的模型组成,相比于单个的大型模型,这些小型模型的组合更易于训练,节省空间和算力。

 

Image
图 1 RMI 模型的层次结构

 

简而言之,RMI 的核心思想是将整个 key 空间分解成更小的空间,这样索引位置分布的累计密度函数 CDF 就更容易使用多个小型的线性模型去拟合。根据[1]的实验表明,相比于 B-tree 结构,该架构的学习型索引能够将存储代价降低 99%。

RMI 可以用作一维数据概要,因为它本质上表示主键分布函数 CDF,这类似于一维直方图等其他统计概要结构。然而,要将这个想法扩展到多维数据具有挑战性,因为与一维数据不同,多维数据点之间没有明确的排序顺序。

有一种解决方案是借助空间填充曲线,将 k 维空间数据映射成 1 维,随后使用降维的数据训练 RMI 模型。诸如 z-order 曲线或者是 Hilbert 曲线都是可行的降维方案,但问题在于,在数据降维的过程中存在信息丢失,因此基于这种方案的拓展 RMI 方法会损失部分估计的精确度。

另一种方案则是直接用模型学习空间数据的联合分布函数,最近提出的 Naru [2]和 DeepSPACE [3]就是典型的,通过自回归模型拟合多维数据联合分布的例子。这些研究均宣称它们的模型显著改善了基数估计的准确性,然而这些模型仍然不能很好地实现准确率与存储空间的平衡。

本文则基于 RMI 的架构之上提出了对 MEH 的改进方案。

 

LUIST结构

 

Image

图 2 MEH 对 2D 数据的切分演示

 

首先以二维 (d = 2) 多维等深直方图 MEH 为例子,设 bucket = 5。首先在 “纵向” 按照等深策略分割空间数据 X,即 5 个数据域内的样本点数量保持相同;其次,按照同样的策略对每个数据域再进行 “横向” 切割,并最终得到 5 × 5 = 25 个等深区域。

本文提出的 LHIST 模型可以被概括为学习型 MEH。即,相较于上述的等深 “硬分割” 策略,本文使用简单的线性模型对每一维度的数据边界进行 “软分割”,每个数据区域称之为桶 bucket。

 

Image

图 3 LHSIT 结构展示

 

LHIST 则仿照 RMI 的层次结构构建了一个完全 k 叉树回归模型,如图 3 所示,其中 k 为每一个数据维度的划分数量。设数据点 x 是一个 d 维向量,则回归模型将沿着自上而下的 stage 依次对这 d 维数据列进行分割。

LHIST 在前 d - 1 的 stage 将整个 d 维数据集分解成小桶,然后在最后一层 stage 训练模型来近似桶内分布 CDF。与之前简单地将直方图与拟合曲线相结合的研究不同 [4],本文 LHIST 模型的桶分区策略和桶内分布 CDF 估计都是由简单机器学习模型实现得到,它们很容易被优化。为此,LHIST 可以生成一个完全数据驱动的分桶方案,同时避免不切实际的假设,最终构建出一个高效,低存储的多维直方图。

LHIST 的结构能以递归的形式进行定义。在 LHIST 的第一个 stage 定义根节点 R,它代表了整个数据集。fR 表示了回归模型,它接受输入向量 x,并首先输出 x 在第 1 个维度的索引位置 idx(1)(x) ,即:

 

Image
公式 2 根节点在第 1 维对数据划分

 

在 LHIST 中,可以使用任何一个以非递减作为约束条件的回归模型。在训练 fR 之后,整个数据集 X 将被划分成 k 个桶。从 R 节点划分出的第 i 个桶可以符号化表示为:

 

Image
公式 3 节点的数据分片记作 Buckets

 

每个桶 Bj® 将沿着第 2 个维度继续搜寻索引位置 idx(2)(x),即:

 

Image
公式 4 基于 Buckets 在第 2 维继续对数据划分

 

推广到更一般的情形,对于第 i 个层级 ( i = 2,…, d - 1 ) 的任意一个节点 A,令 XA 表示 A 节点覆盖的数据空间,记 NA = |XA|。

在构建 LHIST 之后,模型将在前 d - 1 个 stage 中把整个数据空间 X 分成 k d-1个桶,每个桶最终都将关联一个叶子节点。最后第 d 层的叶子节点将负责构造第 d 维数据的桶内分布。

对于给定分为查询所对应的超矩形 R,其基数估计可以符号化表示为:

 

Image
公式 5 将基数估计问题转换为节点求和问题

 

其中,超矩形 R 所覆盖的叶子节点 A 构成了一个集合。对于被覆盖的每个节点 A,模型通过 x(d) 谓词的范围计算出当前节点的基数估计结果。比如,给定一个谓词 [20, 40],基数 = |fA(40) - fA(20)|。而又由于每个叶子节点之间是相互独立的,因此将所有被覆盖节点的结果做加和即可求得某范围查询 R 对应的 COUNT 基数。

与 RMI 相比,LHIST 是一个严谨的树形结构,而 RMI 结构中的一个子节点可以存在多个父节点,这会导致 RMI 模型需要更多的空间来存储参数,维持层次结构。

 

函数选择

 

前文曾提及 fA 可以是任意一个非递减的回归模型。但实际上,模型的选择对 LHIST 的精度和存储运算产生深刻的影响。

作为最简单的模型,线性回归模型 (比如 f(x) = ax + b) 非常容易存储和训练。然而,仅使用线性函数很难描述现实数据中复杂的 CDF。另一方面,虽然模型的层次越深,就越能描述复杂的 CDF,但是这会导致参数调优变得异常困难,这样的模型不符合 LHIST 的性能要求。

作为性能和存储的最佳权衡,本文选取了单变量多项式函数,它能够灵活地控制模型的复杂度,即 ploy(x) = w0 + w1·x + … + wp · xp,p 作为多项式的度数。用户可以通过设置 p 来决定更高的精度,或者是更低的存储空间。

假定 {(xi, yi)}i=1,…n 是一组容量为 n 的样本点,其中 yi∈{ 1, … , n } 是 xi 对应的索引次序,紧接着,一组 poly(xi) 的拟合函数可以如下表示:

 

Image
公式 6 权值 W 即模型的优化目标

 

令 y = [y1, … , yn]T 是参考值向量,p 是预测值向量。本文的建模问题可以转换为最小二乘问题:

 

Image
公式 7 将基数估计转换为最小二乘问题

 

此处设置条件约束 ploy’(x)≥0 的目的是保证 ploy(x) 是非递减函数,这满足 CDF 的语义。进一步,本文通过数学方法将非递减作为约束的最小二乘问题转化成了半正定规划:

 

Image
公式 8 将公式 7 转换为半正定规划问题

 

最终,模型通过该规划的约束条件学习 W = [w0, w1, … wp] T,并使得模型的误差最小。

 

与MEH方法的比较

 

和单纯的 MEH 方法相比,LHIST 对存储预算的利用率更高。本质上,每一条 MEH entry 都需要一个整数存储频率,并且使用一个浮点数存储桶的边界。给定同等的存储空间,经过训练的紧凑型回归模型可以在不作任何理想假设的前提下编码更多的局部分布信息。

在相同的存储预算下,本文的 LHIST 在精度方面比 MEH 高出 24 倍,运行效率方面则比 MEH 高出 1.8 倍。

 

▋实验部分

一、数据集及其参数设置

本实验中使用的数据集如下:

 

Image

 

表 1 实验用空间数据集

作为对比实验,本实验对以下超参数进行了不同的设置:

 

Image

表 2 对内存,多项式度,选择率的设置

 

参与比较的方法有:

 

Image

表 3 参与对比的多种模型

 

随机采样法。随机采样法有两种策略,即简单随机采样 (RS) 以及分层采样 (SS)。

多维直方图。和 [5]类似,本文实现了两种直方图作为对比,即均匀直方图 (UH) 以及多维等深直方图 (MEH)。

RMI。如前文所述,当前的方法结合了 z-order 方法实现了 1-D RMI 线性回归模型,以构建数据概要。

深度无监督学习。这里使用了具有代表性的 Naru 模型,本文按照由小到大的次序创建了三个不同规模的模型实例:Naru-s (small),Naru-m (middle),Naru-l (large)。

LHIST。本文实现了三种 LHIST 结构:LHIST + 线性回归 (l-LHIST),LHIST + 分段线性回归 (plr-LHIST),LHIST + 多项式回归 (p-LHIST)。

为了评估基数估计器的准确度,这里选取公式 9 作为评估标准:

 

Image
公式 9 模型衡量指标

 

二、准确度评估

 

Image
图 4 不同模型在不同选择率下的准确率性能

 

图 4 绘制了范围查询的基数估计模型在不同内存预算下的准确率表现。通常情况下,给定更多的预算 B 能够提高以上方法的准确率。除了 RMI 方法之外,其它方法在预算足够 (budget = 128 MB) 且查询选择度足够高的情形下 (Selectivity = 10 -1) 能够达到超过 95% 的准确率,这验证了前文的观点:应用 z-order 等降维手段会影响 RMI 模型估计的准确率。

与 Naru 相比,LHIST 能够在选择度 >10 -3的情况下达到相近的性能。然而 LHIST 在低选择度查询的表现则更加稳定。在低选择度下,增加 Naru 的神经元数量反而会降低准确率,因为 DL 模型学习联合分布的过程是不可解释的;而 LHIST 则可以用很小的内存预算保留多维数据的完整信息。

三、构建代价

传统数据概要方法的构建代价显然要更小,因此这里重点观察并对比学习型的方法:Naru,RMI,以及 LHIST。结果对比见图 5:

 

Image
图 5 不同模型基于不同数据集的构建代价

 

在学习型数据概要方法中,LHIST 的构建时间总体最短,仅比非学习型的 MEH 方法稍微耗时一些。值得注意的是,Naru 总是需要最多的模型构建时间。尤其是在最大的数据集 osm-all-nodes 上,Naru-m 需要将近 8 小时的时间进行训练,这主要是受到了 GPU 内存限制的影响。

四、推理时延

 

Image

图 6 不同模型在不同内存预算下的推理时延

 

图 6 展示了 osm-all-nodes 数据集上,不同模型对范围 COUNT 查询的处理时延。本文使用了前缀和技巧优化了均匀直方图 UH,因此在当前的实验中,它只需要常数量级的代价。

RMI 的处理效率接近于常量,因为它只需要计算R 的下边界 R.xH 和上边界 R.xL;Naru 的处理效率接近于常量,这主要取决于模型的复杂度。

本文通过实验观察到,LIHIST 模型要比 MEH 的效率高出 1.1 ~ 1.9 倍。这是因为 MEH 的桶分区是非均匀的,因此该方法需要多轮二分查找才可以定位到某个区域,尤其是分桶变得十分复杂时,MEH 的查找将消耗显著的时间。相比之下,LHIST 只需要经过固定的 d 层 stage,且每一层模型都是简单的多项式。

五、不同子模型的选择

本文比较了 LHIST 下的几个不同子模型,并且在 wesad 数据集上做了实验,实验结果如图 7。

 

Image

图 7 不同函数选择对推理效率的影响

 

总体来说,使用多项式作为 fA 能够在效率和准确率当中达到一个最佳的平衡。与 l-LHIST 方法相比,p-LHIST 只需要更少的桶数量,因此它可以更快地遍历 HLIST 树。不仅如此,p-LHIST 可以在非常有限的内存预算中达到更高的准确率。

六、多项式度 p 的影响

为了测试不同 p 对 p-LHIST 性能的影响,本文分别在 osm-all-nodes 和 random 两个数据集下做了两个实验,这里将测试查询的选择度固定为 10 -3。

 

Image

图 8 p 值对准确率的影响呈单峰函数

 

可以观察到图像接近单峰函数,当 p ∈ [4, 6] 时,模型的准确率接近达到最高值。除此之外,研究还表明,当模型需要处理高维数据时,选取最佳的度数 p 将变得至关重要。这是因为维度 d 越大,则数据空间越稀疏。此时需要更加细粒度的数据划分,从而保证桶内的数据分布 CDF 更加容易学习。

 

相关工作

 

本文首先讨论并比较已有的数据概要以及学习型索引。

  • 直方图。 多维直方图可以联合数据分布的近似。STHoles [6]是一种查询驱动的直方图方法,根据查询负载来对数据进行分区。本文的方法则是完全数据驱动的方法,并将未来的负载感知优化作为未来的工作。

  • 学习型索引。 已有的研究已证明了 B-tree 的索引结构可以被简单的机器学习模型所替代,比如 RMI [1]。目前还有很多学者开始了对学习型索引的研究。比如 Ding 等人提出了名为 ALEX [7]的,可适应动态负载的学习型 B-tree。

如本文所述,想要将 1-D 学习型索引拓展到多维数据库是一个具有挑战的任务,因为数据点通常没有明确的排序关系。

  • AI in DB。 除了学习型索引之外,机器学习还广泛地应用到了连接代价估计, [8], [9],查询优化器 [10], [11],和 DBMS 自调参 [12], [13]。

本文的工作可被归类为学习型基数估计以及近似查询处理,如 DeepSPACE 和 Naru 模型。然而,目前的学习型估计器的通用性较差,主要是无法实现存储和精度之间的权衡。

 

写在最后

 

本文提出的 LHIST 属于空间数据概要框架,它可被看作是 MEH 的学习型版本。LHIST 完全由数据驱动,并且不依赖专家经验调整模型参数。经过实验表明,LHIST 在效率和准确率方面均优于传统的数据摘要方法。


*参考文献:

[1] T. Kraska, A. Beutel, E. H. Chi, J. Dean, and N. Polyzotis, “The case for learned index structures,” in SIGMOD Conference. ACM, 2018, pp. 489–504.

[2] Z. Yang, E. Liang, A. Kamsetty, C. Wu, Y. Duan, P. Chen, P. Abbeel, J. M. Hellerstein, S. Krishnan, and I. Stoica, “Deep unsupervised cardinality estimation,” PVLDB, vol. 13, no. 3, pp. 279–292, 2019.

[3] D. Vorona, A. Kipf, T. Neumann, and A. Kemper, “DeepSPACE: Approximate geospatial query processing with deep learning,” in SIGSPATIAL/GIS. ACM, 2019, pp. 500–503.

[4] A. C. König and G. Weikum, “Combining histograms and parametric curve fitting for feedback-driven query result-size estimation,” in VLDB. Morgan Kaufmann, 1999, pp. 423–434.

[5] A. B. Siddique, A. Eldawy, and V. Hristidis, “Comparing synopsis techniques for approximate spatial data analysis,” Proc. VLDB Endow., vol. 12, no. 11, pp. 1583–1596, 2019.

[6] N. Bruno, S. Chaudhuri, and L. Gravano, “STHoles: A multidimensional workload-aware histogram,” in SIGMOD Conference. ACM, 2001, pp. 211–222.

[7] J. Ding, U. F. Minhas, J. Yu, C. Wang, J. Do, Y. Li, H. Zhang, B. Chandramouli, J. Gehrke, D. Kossmann, D. B. Lomet, and T. Kraska, “ALEX: an updatable adaptive learned index,” in SIGMOD Conference. ACM, 2020, pp. 969–984.

[8] J. Sun and G. Li, “An end-to-end learning-based cost estimator,” PVLDB, vol. 13, no. 3, pp. 307–319, 2019.

[9] B. Hilprecht, A. Schmidt, M. Kulessa, A. Molina, K. Kersting, and C. Binnig, “DeepDB: Learn from data, not from queries!” Proc. VLDB Endow., vol. 13, no. 7, pp. 992–1005, 2020.

[10] R. C. Marcus, P. Negi, H. Mao, C. Zhang, M. Alizadeh, T. Kraska, O. Papaemmanouil, and N. Tatbul, “Neo: A learned query optimizer,” PVLDB, vol. 12, no. 11, pp. 1705–1718, 2019.

[11] C. Wu, A. Jindal, S. Amizadeh, H. Patel, W. Le, S. Qiao, and S. Rao, “Towards a learning optimizer for shared clouds,” PVLDB, vol. 12, no. 3, pp. 210–222, 2018.

[12] T. Kraska, M. Alizadeh, A. Beutel, E. H. Chi, A. Kristo, G. Leclerc, S. Madden, H. Mao, and V. Nathan, “SageDB: A learned database system,” in CIDR. www.cidrdb.org, 2019.

[13] S. Idreos, N. Dayan, W. Qin, M. Akmanalp, S. Hilgard, A. Ross, J. Lennon, V. Jain, H. Gupta, D. Li, and Z. Zhu, “Design continuums and the path toward self-designing key-value stores that know and learn,” in CIDR. www.cidrdb.org, 2019.

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

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

相关文章

mysql逻辑架构和数据库缓冲池

逻辑架构 典型的CS架构&#xff0c;服务端程序使用的是mysqld 客户端进程向服务器进程发送一段文本&#xff08;SQL语句&#xff09;&#xff0c;服务器进程处理后再向客户端进程发送文本&#xff08;处理结果&#xff09; # 应用连接层: # 连接处理,用户鉴权(username,host…

分享|2023年全球市场准入认证咨讯

作为全球应用安全科学专家&#xff0c;UL Solutions服务全球100多个国家和地区的客户&#xff0c;将产品安全、信息安全和可持续性挑战转化为客户的机遇。UL Solutions 提供测试、检验、认证&#xff08;TIC&#xff09;&#xff0c;以及软件产品和咨询服务&#xff0c;以支持客…

Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查 (IEEE TPAMI 2020)

Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习&#xff1a;一项调查&#xff08;IEEE TPAMI 2020&#xff09;摘要1. 引言2. 背景2.1 数据集2.2 评估指标3. 3D形状分类3.1 基于多视图的方法3.2 基于体积的方法3.3 基于点的方法3.3.1 逐点MLP方法3.3.2 基于卷…

AI助力多文档审查丨合同风险审查、招投标文件、合同和中标通知书一致性审查

当下&#xff0c;企业管理的数据和文档管理中充斥着大量有复用价值的数据、资料和内容性信息。每一家企业都有许多商业文档和法律文档需要使用和维护&#xff0c;其中包含了不同语言文字、手写体、数字、公式等。然而&#xff0c;目前企业的各种文档资料仍主要依靠人工手段进行…

【Redis】Redis面试题详解与使用案例(金三银四面试专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。 文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公司…

ipv6实验

r1的配置为 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip address 12.1.1.1 24 [r1]int lo0 [r1-LoopBack0]ip address 1.1.1.1 32 [r1]ip route-static 0.0.0.0 0 12.1.1.2 r2的配置为 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip address 12.1.1.2 24 [r2]int lo0 […

小红书破局品牌增长:4大阶段+8个种草建议

品牌如何从激烈的竞争中突围&#xff0c;成为快速增长的“黑马”&#xff1f;本文就和大家一起聊聊围绕产品面对不同阶段的人群“种草”策略&#xff0c;希望能够帮助品牌更好地与用户沟通并提升营销效率&#xff0c;实现品效合一。 1、种草1.0 —— 立住产品&#xff0c;抢占赛…

Minecraft 1.19.2 Fabric模组开发 10.建筑生成

我们本次尝试在Fabric 1.19.2中生成一个自定义的建筑。 效果展示效果展示效果展示 由于版本更新缘故&#xff0c;1.19的建筑生成将不涉及任何Java包的代码编写&#xff0c;只需要在数据包中对建筑生成进行自定义。 1.首先我们要使用游戏中的结构方块制作一个建筑,结构方块使用…

企业内部沟通即时通讯软件要怎么选?

随着企业信息化的快速发展&#xff0c;为了工作效率的提高&#xff0c;即时通讯工具已经成为了众多企业办公时的标配&#xff0c;同时&#xff0c;各大企业对即时通讯功能的要求也越来越高。但是&#xff0c;现在市场上即时通信软件众多&#xff0c;各种功能和服务都是参差不齐…

python爬虫基本库的使用

博主简介&#xff1a;博主是一个大二学生&#xff0c;主攻人工智能领域研究。感谢缘分让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;C&#xff0c;python&#xff0c;爬虫等方面的知识分享。如果有需要的小伙伴&#xff0c;可以关注博主&#xff…

Java面试基础篇

目录 一、集合 1.集合与集合之间的区别 2.集合子类之间的区别&#xff08;数据结构&#xff09; 二、线程 三、面向对象 继承 多态 四、异常 五、IO流 六、序列化与反序列化 今天给大家分享 Java基础篇的面试题&#xff0c;小编给大家稍微整理了一下&#xff0c;希望即…

RHCE(web服务器)

文章目录一、www简介&#xff08;一&#xff09;网址及HTTP简介&#xff08;二&#xff09;HTTP协议请求的工作流程二、www服务器的类型&#xff08;一&#xff09;仅提供用户浏览的单向静态网页&#xff08;二&#xff09;提供用户互动接口的动态网站三、www服务器的基本配置四…

苹果证书p12和描述文件的创建教程

在hbuilderx或apicloud这些uniapp框架工具打包苹果APP的时候&#xff0c;需要p12证书和证书profile文件来编译&#xff0c;目前网上很少使用windows电脑生成p12证书的教程&#xff0c;官方的教程都是需要使用苹果电脑来创建的。 这里&#xff0c;我们这篇文章来教会大家如何使…

【虚拟仿真】Unity3D中实现鼠标悬浮UI上显示文字

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章实现一个鼠标悬浮在UI上显示文字的功能&#xff0c;实…

LMK04828时钟芯片配置历程——SPI接口

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LMK04828时钟芯片配置历程——SPI接口总结最近有一个开发板需要去调试&#xff0c;开发板上包含了AD9371和LMK04828时钟芯片&#xff0c;而我的任务是需要将他们都配置起来。…

c++入门之输入输出命名空间

文章目录前言一、输入输出二、命名空间1.使用命名空间的原因2.命名空间定义3.命名空间的定义注意事项&#xff08;1&#xff09;命名空间只能在全局范围使用&#xff08;2&#xff09;命名空间可以嵌套&#xff08;3&#xff09;命名空间是开放的,可以随时添加新的成员&#xf…

mysql流程控制

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;数据库 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;请…

QT---制作简易串口助手

一、ui制作打开QTCreator创建一个新文件2.进入UI设计界面进行设计进入ui界面后&#xff0c;选择相应的控件将串口助手的样子给做出来&#xff0c;我选择的是如下的控件做这个串口助手&#xff1a;1.按钮&#xff1a;2.下拉列表3.标签4.组合框5.文本编辑绘制ui界面如下&#xff…

如何用Windows自带命令修改文件和图片的MD5

首先说下&#xff0c;md5到底是啥&#xff0c;它是一段固定长度的数据。无论原始数据是多长或多短&#xff0c;其MD5值都是128bit。另外md5是确定性&#xff0c;一个原始数据的MD5值是唯一的&#xff0c;同一个原始数据不可能会计算出多个不同的MD5值&#xff1b;类似人类的身份…

快速搭建前后端分离项目

后端 配置文件和依赖 创建一个SpringBoot项目&#xff0c;采用Mybatis-Plus快速构建项目。 application.yml进行配置 server:port: 80spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/ems?useSSLfalse&useUnicodetrue&charact…