Rust 导出和导入内存数据的方案?

2022-05-22 19:27:35 +08:00
 Richard14

需求上需要储存和中转计算数据,比如 Vec<Vec<f16>> -> Bytes ,然后存入数据库,之后业务节点读取之后再转换回 vec 这种的。测试了一下各语言通用的 json ,不太符合需求,因为会把 f16 这种类型转换成具体数值的数字再储存,不与内存储存格式一致,有点浪费空间,rust 有什么直接内存导入导出的魔法吗?

1947 次点击
所在节点    Rust
11 条回复
gwy15
2022-05-22 20:02:13 +08:00
rust 不保证内存储存格式稳定的,如果愿意 unsafe 就直接 transmute / maybeuninit
ihehe
2022-05-22 20:04:35 +08:00
这是个序列化 /反序列化的问题,跟语言无关,基本上任何语言都有一堆各自的序列化工具。
空间问题一般序列化工具优化的有限,对空间有要求的一般都是序列化后再加一层压缩,什么 gzip/zstd 啥的
PureWhiteWu
2022-05-22 20:05:19 +08:00
别用 json ,用 thrift ,直接用内存中的 bit 。
hsfzxjy
2022-05-22 20:28:58 +08:00
rkyv
Buges
2022-05-22 21:15:59 +08:00
这不是格式稳不稳定的问题,导出了你也没法用。你想想 Vec<Vec>是一系列指针组成的 Vec ,你导出去也是一堆内存地址有什么用。
直接找个高性能二进制的序列化格式就是了,如 http://cbor.io/
polythene
2022-05-22 22:01:03 +08:00
@PureWhiteWu thrift 的这个 bit 序列化有处理大小端吗?
timpaik
2022-05-23 00:43:41 +08:00
试试 bincode ,这个可以直接序列化,性能很不错
PureWhiteWu
2022-05-23 09:46:11 +08:00
@polythene 有的
klusfq
2022-05-23 12:52:36 +08:00
msgpack 是不是也不错?
Richard14
2022-05-23 17:13:44 +08:00
@klusfq 测过,不太行
TK4E
2022-06-09 12:24:00 +08:00
可以这样
但需要你自己保证内存对齐

fn as_bytes(&self) -> &[u8] {
unsafe {
std::slice::from_raw_parts(
(self as *const Self) as *const u8,
std::mem::size_of::<Self>(),
)
}
}

具体的代码
https://github.com/rsuu/Learn/blob/main/Rust/Learn/Crate/byteorder/examples/3.rs

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/854529

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX