需求上需要储存和中转计算数据,比如 Vec<Vec<f16>> -> Bytes ,然后存入数据库,之后业务节点读取之后再转换回 vec 这种的。测试了一下各语言通用的 json ,不太符合需求,因为会把 f16 这种类型转换成具体数值的数字再储存,不与内存储存格式一致,有点浪费空间,rust 有什么直接内存导入导出的魔法吗?
1
gwy15 2022 年 5 月 22 日
rust 不保证内存储存格式稳定的,如果愿意 unsafe 就直接 transmute / maybeuninit
|
2
ihehe 2022 年 5 月 22 日 via iPhone
这是个序列化 /反序列化的问题,跟语言无关,基本上任何语言都有一堆各自的序列化工具。
空间问题一般序列化工具优化的有限,对空间有要求的一般都是序列化后再加一层压缩,什么 gzip/zstd 啥的 |
3
PureWhiteWu 2022 年 5 月 22 日 别用 json ,用 thrift ,直接用内存中的 bit 。
|
4
hsfzxjy 2022 年 5 月 22 日 via Android
rkyv
|
5
Buges 2022 年 5 月 22 日 via Android
这不是格式稳不稳定的问题,导出了你也没法用。你想想 Vec<Vec>是一系列指针组成的 Vec ,你导出去也是一堆内存地址有什么用。
直接找个高性能二进制的序列化格式就是了,如 http://cbor.io/ |
6
polythene 2022 年 5 月 22 日
@PureWhiteWu thrift 的这个 bit 序列化有处理大小端吗?
|
7
timpaik 2022 年 5 月 23 日 via Android
试试 bincode ,这个可以直接序列化,性能很不错
|
8
PureWhiteWu 2022 年 5 月 23 日
@polythene 有的
|
9
klusfq 2022 年 5 月 23 日
msgpack 是不是也不错?
|
11
TK4E 2022 年 6 月 9 日
可以这样
但需要你自己保证内存对齐 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 |