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