rkyv —— Rust 的零拷贝反序列化框架
rkyv 是一个用于 rust 的零拷贝反序列化框架。
它类似于其他零拷贝反序列化框架,例如 Cap'n Proto 和 FlatBuffers。然而,前者具有外部模式和严格限制的数据类型,而 rkyv 允许在代码中定义所有序列化类型,并且可以序列化其他类型无法序列化的各种类型。此外,rkyv 被设计为几乎没有开销,并且在大多数情况下将执行与本机类型完全相同的操作。
与 serde 一样,rkyv 使用 Rust 强大的特征系统来序列化数据而无需反射。尽管具有广泛的功能,但你也只需为使用的功能付费。如果你的数据检出,序列化过程可以像memcpy
一样简单。与 serde 一样,这允许 rkyv 以类似于手写序列化程序的速度执行。
与 serde 不同,rkyv 生成的数据保证没有反序列化。如果你将数据写入磁盘,你只需将文件mmap
写入内存,投射一个指针,你的数据就可以使用了。这使其成为高性能和 IO 密集型应用程序的理想选择。
通过 Pin API 支持有限的数据突变,如果需要完整的突变功能,归档的值可以通过 Deserialize 真正反序列化。
rkyv 有一个 hashmap 实现,它是为零拷贝反序列化而构建的,所以你可以随意序列化你的 hashmaps。该实现使用压缩、散列和置换算法执行完美散列,以使用尽可能少的内存,同时仍然执行快速查找。
它还带有 B+ 树实现,该实现通过将数据拆分为易于分页的 4KB 段来实现最佳性能。这使得它非常适合为批量数据构建不可变的数据库和结构。
rkyv 还支持上下文序列化、反序列化和验证。它可以正确地序列化和反序列化共享指针,如Rc
和Arc
,并且可以扩展以支持自定义上下文类型。
最后,rkyv 使得序列化 trait 对象成为可能,并且无需反序列化就可以将它们用作 trait 对象。更多细节见archive_dyn
crate。
虽然 rkyv 是最终数据的一种很好的格式,但它缺乏完整的模式系统,并且不能很好地进行数据迁移和模式升级。如果你的用例需要这些功能,可能需要额外的库来在 rkyv 之上构建这些功能。可以使用与 rkyv 相同类型的其他序列化框架,如 serde,无冲突。
示例:
use rkyv::{Archive, Deserialize, Serialize}; // bytecheck can be used to validate your data if you want use bytecheck::CheckBytes; #[derive(Archive, Deserialize, Serialize, Debug, PartialEq)] // This will generate a PartialEq impl between our unarchived and archived types #[archive(compare(PartialEq))] // To use the safe API, you have to derive CheckBytes for the archived type #[archive_attr(derive(CheckBytes, Debug))] struct Test { int: u8, string: String, option: Option<Vec<i32>>, } let value = Test { int: 42, string: "hello world".to_string(), option: Some(vec![1, 2, 3, 4]), }; // Serializing is as easy as a single function call let bytes = rkyv::to_bytes::<_, 256>(&value).unwrap(); // Or you can customize your serialization for better performance // and compatibility with #![no_std] environments use rkyv::ser::{Serializer, serializers::AllocSerializer}; let mut serializer = AllocSerializer::<0>::default(); serializer.serialize_value(&value).unwrap(); let bytes = serializer.into_serializer().into_inner(); // You can use the safe API for fast zero-copy deserialization let archived = rkyv::check_archived_root::<Test>(&bytes[..]).unwrap(); assert_eq!(archived, &value); // Or you can use the unsafe API for maximum performance let archived = unsafe { rkyv::archived_root::<Test>(&bytes[..]) }; assert_eq!(archived, &value); // And you can always deserialize back to the original type let deserialized: Test = archived.deserialize(&mut rkyv::Infallible).unwrap(); assert_eq!(deserialized, value);

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
每日一博 | Go 服务自动收集线上问题现场
前言 对于 pprof,相信熟悉 Go 语言的程序员基本都不陌生,一般线上的问题都是靠它可以快速定位。但是实际项目中,很多时候我们为了性能都不会开启它,但是出了问题又要靠它来分析。好在 go-zero 已经帮我们很好的集成进来了,我们只需要像开关一样去开启、关闭它即可,这样我们就可以配合运维监控,当出现 cpu、内存等异常情况时候,自动开始开启收集(比如大半夜你睡的正香的时候),那么第二天可以通过分析当时的采样还原现场,那我们看看 go-zero 是如何做的。 源码分析 我们可以看 go-zero 源码位置 https://github.com/zeromicro/go-zero/blob/master/core/proc/signals.go func init() { go func() { ... signals := make(chan os.Signal, 1) signal.Notify(signals, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGTERM) for { v := <-signals switch...
- 下一篇
CHM 公开发布 Adobe PostScript 源代码
美国计算机历史博物馆 (Computer History Museum,CHM) 宣布公开发布并长期保存 Adobe 的 PostScript 源代码,作为其代码艺术系列的一部分。 “计算机历史博物馆很高兴首次公开发布突破性打印技术 PostScript 的源代码。我们感谢 Adobe, Inc. 的许可和支持,并感谢 John Warnock 对此次发布的支持。” 代码下载:https://info.computerhistory.org/aoc-postscript PostScript 是 Adobe 于 1984 年推出的第一款产品,是桌面出版行业的重要组成部分;加速了 computing 对 printing 的转变,并推动了 Adobe 作为知名软件公司的成长。 起初,秉承着“任何计算机都可以通过一种通用语言与打印机和排字机连接,以最高保真度打印文字和图像”的愿景;在 Adobe 联合创始人 John Warnock 的带领下,Adobe 组建了一个程序员团队来创建这种用于高质量印刷的新编程语言,允许根据用户的喜好缩放、旋转和移动文本和图像。除了两位联合创始...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址