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

news/2024/10/6 3:28:13/文章来源:https://www.cnblogs.com/cnyuyang/p/18288380

本文捋一下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 结构体被设计成一个通用容器,它可以包含不同类型的字节序列,并提供一系列方法来操作这些数据。

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

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

相关文章

张高兴的 MicroPython 入门指南:(二)GPIO 的使用

目录什么是 GPIO使用方法使用微动开关点亮板载 LED硬件需求电路代码参考 什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。 Raspberry Pi Pico 左右两侧各有一列 GPIO 引脚, Pico 通过这两列引脚进行一些硬件上的扩展,与传感器进行交互等等。…

MySQL-17.其他数据日志

C-17.其他数据日志 在之前的数据库事务的章节中,已经讲过,redo log和undo log。 对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。我们可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误,警告和注…

如何恢复SSD NVME固态硬盘的数据恢复

一、使用数据恢复软件 操作步骤(以EaseUS Data Recovery Wizard为例): 安装软件:从EaseUS官网或其他可靠来源下载并安装EaseUS Data Recovery Wizard。 连接固态硬盘:将SSD NVMe固态硬盘连接到电脑上,并确保系统能够识别。 启动软件并选择恢复选项:打开EaseUS Data Reco…

raid5存储池已损毁硬盘数据

RAID 5存储池中的硬盘数据损毁是一个复杂的问题,因为它涉及到数据的冗余、存储方式以及恢复策略。 一、RAID 5的工作原理 RAID 5是一种使用条带化和奇偶校验技术的存储解决方案,它至少需要三个硬盘来构建。在这种配置中,数据和奇偶校验信息被分布在所有硬盘上,以提供数据冗…

SSD NVME固态 硬盘 数据恢复

SSD NVMe固态硬盘数据恢复是一个复杂但并非不可能的任务,以下是一些建议的方法和步骤: 一、了解数据恢复的基本原理 数据恢复的基本原理在于,即使文件在操作系统中被删除或格式化,其实际数据在硬盘的物理介质上可能仍然存在,只是被标记为可覆盖。 SSD NVMe固态硬盘与传统的…

磁盘阵列中raid5坏了一个硬盘数据恢复

RAID5数据恢复步骤包括备份数据、更换故障硬盘、重建RAID阵列和数据恢复注意事项。在恢复过程中,需遵循正确的步骤并保持冷静,不要尝试自行解决复杂的数据恢复问题,以免造成不可逆转的数据损失。完成恢复后,应进行完整性检查和验证。 一、概述 RAID 5是一种存储配置,它将多…

电脑开机检测不到硬盘怎么办 电脑检测不到硬盘问题解决

电脑开机检测不到硬盘,无法进入系统或者显示“Reboot and Select proper Boot device”等错误信息。这种情况可能会导致我们的数据丢失或者无法使用电脑。 一、电脑检测不到硬盘的可能原因 电脑检测不到硬盘的原因主要有以下几种:1、硬盘连接线松动或损坏:硬盘是通过SATA线或…

CentOS 7 下载 网络配置 ssh配置 JDK配置 Python3配置 Git配置 nvm配置 防火墙配置

背景 CentOS 8系统2021年12月31日已停止维护服务,CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 9及后续版本,不再支持新的软件和补丁更新。 所以我们如果要安装服务器操作系统就需要安装centos7。这里我是用虚拟机安装的centos7mini版,mini版本是…

IBM服务器raid1数据恢复

IBM服务器RAID1数据恢复是一个相对复杂的过程,因为RAID1涉及数据的镜像和冗余,但一旦数据丢失,恢复的可能性仍然存在。以下是一些建议的步骤和注意事项,以帮助您进行IBM服务器RAID1数据恢复: 一、停止使用受影响的服务器 一旦发现数据丢失,首要任务是停止使用受影响的服务…

服务器刷新BIOS后死机

服务器刷新BIOS后死机是一个比较常见的问题,可能由多种原因引起。 一、原因分析 BIOS文件问题: 刷新的BIOS文件可能本身就是坏的,或者与服务器硬件不兼容。 BIOS版本选择不当,也可能导致兼容性问题。 刷新过程问题: 刷新过程中突然断电或操作不当,可能导致BIOS损坏。 硬件…

其他计算机系统基础知识

计算机语言计算机语言是指用于人与计算机之间交流的一种语言,是人与计算机之间传递信息的媒介。计算机语言主要由一套指令组成,而这种指令一般包括表达式、流程控制和集合三大部分内容。表达式又包含变量、常量、字面量和运算符。 流程控制有分支、循环、函数和异常。 集合包…

函数,调试,循环,头文件

1.关于函数 作用:避免代码重复 可以方便维护,因为当多个地方需要用到同样的代码时,如果要做出修改只需要改函数就能整体修改。 函数通常都会有返回值,什么类型的函数返回什么样的类型的值 函数通常分为函数声明和函数参数通常声明放在头文件中 函数定义发在C++文件中 这样做…