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