首页 > 其他分享 >mini-lsm通关笔记-字符相关操作

mini-lsm通关笔记-字符相关操作

时间:2024-07-07 12:52:08浏览次数:16  
标签:mini u8 lsm Bytes vec 字节 通关 数据 Vec

本文捋一下mini-lsm中的字符相关操作

  • [u8]
  • Vec<u8>
  • Bytes
  • Buf
  • KeySlice
  • KeyBytes

[u8]Vec<u8>

这两个是rust内置的数据类型。

[u8]: 切片本身并不拥有数据,而是引用了数据。它由一个指向数组开始处的指针和一个表示数组长度的计数器组成。[u8]类型通常写作&[u8],这是因为切片通常是以引用的形式出现的。

Vec<u8>: Vec<u8>是一个可变的、动态大小的向量,它可以存储任意数量的u8字节。向量拥有它所存储的数据,并且可以动态地在其生命周期内增长或缩小。

所以在mini-lsm项目中,解码的入参一般是&[u8]:

因为用于解码的数据一般是从文件中读出来的不可变的持久化的数据

编码的入参一般是&mut Vec<u8>或者返回Bytes:

因为在编码过程中,需要动态的将数据、变量编码成u8类型写入Vec

相互转换:

尽管[u8]Vec<u8>在概念上紧密相关,但它们之间需要进行适当的转换才能互换使用:

Vec<u8>[u8]:可以通过简单的引用转换得到切片,例如:let slice: &[u8] = &vec;

[u8]Vec<u8>:可以通过to_vec()方法将切片转换为向量,例如:let vector: Vec<u8> = slice.to_vec();

总结来说,Vec<u8>是用于动态操作字节序列的更通用和灵活的选择,而[u8]则用于访问现有字节序列的非所有者视图,通常在需要快速访问而不涉及所有权移动的场景下使用。

Bytes

Rust中,bytes是一个非常流行的第三方库,用于高效处理字节序列。这个库提供了BytesBytesMut类型,它们分别类似于Vec<u8>Vec<u8>的不可变和可变版本,但它们针对字节序列的常见操作进行了优化。

所以在mini-lsm项目中Bytes,常用在可能出现数据共享的情况下。比如MemTable中的map他的keyvalue可能被多个地方获取。

相互转换:

BytesVec<u8>:

你可以使用to_vec方法将Bytes转换为Vec<u8>

use bytes::Bytes;

let b = Bytes::from(vec![1, 2, 3]);
let vec: Vec<u8> = b.to_vec();

当你从Bytes转换到Vec<u8>时,这通常会涉及到数据的拷贝,除非你使用一些特殊的技巧或API来避免它。当你调用to_vec方法时,Bytes会返回一个包含相同字节的新Vec<u8>实例。这个操作涉及到数据的拷贝,因为Vec<u8>需要拥有数据的所有权,而Bytes不能放弃它的所有权,因为它可能正在被其他引用共享。

Vec<u8>Bytes:

你可以使用Bytes::from构造函数或者Into<Bytes>转换将Vec<u8>转换为Bytes:

use bytes::Bytes;

let vec = vec![1, 2, 3];
let b: Bytes = Bytes::from(vec);
// 或者
let b: Bytes = vec.into();

当你从Vec<u8>转换到Bytes时,Bytes会采取数据的所有权,这意味着它会拷贝数据或共享数据的引用,具体取决于实现细节。在bytes库的内部,Bytes使用Arc<[u8]>来持有数据,这样多个Bytes实例可以共享同一个数据缓冲区,从而避免不必要的拷贝。

当你使用Bytes::from或者Into<Bytes>转换时,如果底层数据没有被其他任何引用持有,那么Bytes可能会简单地接管Vec<u8>的数据,否则它会创建一个新的Arc来持有数据副本。这是为了保证Bytes实例的不变性,即它是不可变的,并且在多个线程间安全共享。

避免拷贝的情况

在某些情况下,你可以避免显式的数据拷贝。例如,如果你有一个Vec<u8>并且想要创建一个Bytes实例,但是你不再需要原来的Vec<u8>,你可以使用Bytes::copy_from_slice方法来避免拷贝,前提是你能够保证Vec<u8>的数据不再被引用:

use bytes::Bytes;

let vec = vec![1, 2, 3];
let b = Bytes::copy_from_slice(&vec); // 没有拷贝,因为我们只是借用&vec
// 此时,你不能再安全地使用vec,除非你知道它不会被访问直到b超出作用域

Buf

Buftrait提供了读取字节缓冲区的方法。它适用于只读数据,或者在数据被读取后不需要保留原始状态的场景。Buf的主要方法包括:

  • remaining(&self):返回剩余未读取的字节数。
  • chunk(&self):返回一个可读取的字节切片。
  • advance(&mut self, cnt: usize):标记已经读取了cnt个字节,通常在读取数据后调用,以便更新内部状态。
  • split(&mut self):从缓冲区中移除已读取的数据,并返回一个包含这些数据的新Bytes对象。
  • get_u32

同时bytes库为&[u8]实现了Buf,为&mut [u8]Vec<u8>等实现了BufMut

所以我们对Vec<u8>[u8]类型的数据可以直接使用其定义的函数。

KeySliceKeyBytes

项目的key.rs中的实现,定义了一系列结构体和相关的实现,主要围绕着处理字节序列([u8]Vec<u8> 和 ·)的封装和操作。Key 结构体被设计成一个通用容器,它可以包含不同类型的字节序列,并提供一系列方法来操作这些数据。

标签:mini,u8,lsm,Bytes,vec,字节,通关,数据,Vec
From: https://www.cnblogs.com/cnyuyang/p/18288380

相关文章

  • 题解:CF1256D Binary String Minimizing
    贪心。数据范围\(n\le10^{6}\),因此我们要用时间复杂度为\(\mathcal{O}\left(n\right)\)的算法来解决这个问题。思路从左至右扫一遍序列,如果遇到\(10\),则要将这个\(0\)交换到前面的位置。由于是字典序最小,\(0\)应该尽量在最高位。现在需要知道这个\(0\)被交换到哪......
  • 如何通过minIO在后端实现断点续传
     首先是黑马的媒资管理模块流程图:前端负责计算媒资文件的MD5值,同时对媒资文件进行分块。后端需要以下几个接口:1.检查分块是否存在(传入参数为视频唯一标识信息与块信息):检查当前分块是否已经上传至minIO。即通过前端传来的MD5值与chunk的具体值,进入minIO进行核对,如何有那么就是......
  • MinIO使用记录
    探索MinIO:高性能、分布式对象存储解决方案注:本文除代码外多数为AI生成最近因为有项目需要换成AmazonS3的云存储,所以把之前做过的minio部分做一个记录,后面也会把基于这版改造的S3方法发出来记录。MinIO简介MinIO是一款高性能、分布式对象存储服务器,设计用于在大规模环境中......
  • Minimum_jerk参考代码
    1.参考代码importnumpyasnpimportmatplotlib.pyplotaspltfromcvxoptimportmatrix,solversdefgenQk(T_down,T_up):Q=np.zeros((6,6))Q[3][4]=72*(T_up**2-T_down**2)Q[3][5]=120*(T_up**3-T_down**3)Q[4][5]=360*(T_up*......
  • windows terminal 中运行 miniconda 和 pip 的虚拟环境
    pip创建的虚拟环境使用命令python-mvenvhf创建虚拟环境后,在激活时,会遇到一个错误,原因是powershell启动了严格的审查脚本策略。这个错误信息表明你尝试在PowerShell中运行一个脚本(具体是激活一个虚拟环境),但是你的系统设置阻止了未经签名的脚本的执行。PowerShell有一个叫......
  • springboot集成minIO
    文件系统:负责管理和存储文件的系统软件。操作系统通过文件系统提供的接口去存取文件,用户通过操作系统访问磁盘上的文件minIO:轻量级服务分布式文件系统,适合存储非机构化数据。采用去中心化共享架构,结点之间是对等关系。 端口号为9000,初次登录账号密码都是minioadmin minIO中......
  • 《企业实战分享 · 对象存储服务OSS、S3、MinIO》
    ......
  • 【LLM大模型】一本书通关LLM大模型!成功通关大模型,看这本书足够了... (附PDF)
    哈喽大家好!最近有粉丝朋友喊我推荐一些大模型的学习书籍,我给大家推荐这么一本书,基于gbt3、gbt4等transform架构的自然语言处理。这是一本对transform工作原理感兴趣的人必读的书籍。亚马逊的评分是九点七分,内行人在睡不着的时候恨不得把全书都背诵完毕。本书的写作目的是......
  • 打包警告:chunk common [mini-css-extract-plugin]Conflicting order between:
    1.问题webpage5打包告警:chunkcommon[mini-css-extract-plugin]Conflictingorderbetween:2.解决方案:-vue.config.js配置//vue.config.jsmodule.exports={//...,css:{extract:{ignoreOrder:true},}};或者:调整组件引入的顺序3.......
  • LeetCode 857. Minimum Cost to Hire K Workers
    原题链接在这里:https://leetcode.com/problems/minimum-cost-to-hire-k-workers/description/题目:Thereare n workers.Youaregiventwointegerarrays quality and wage where quality[i] isthequalityofthe ith workerand wage[i] istheminimumwagee......