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