V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Richard14
V2EX  ›  Rust

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

  •  
  •   Richard14 · 2022-05-22 19:27:35 +08:00 · 1982 次点击
    这是一个创建于 924 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    11 条回复    2022-06-09 12:24:00 +08:00
    gwy15
        1
    gwy15  
       2022-05-22 20:02:13 +08:00
    rust 不保证内存储存格式稳定的,如果愿意 unsafe 就直接 transmute / maybeuninit
    ihehe
        2
    ihehe  
       2022-05-22 20:04:35 +08:00 via iPhone
    这是个序列化 /反序列化的问题,跟语言无关,基本上任何语言都有一堆各自的序列化工具。
    空间问题一般序列化工具优化的有限,对空间有要求的一般都是序列化后再加一层压缩,什么 gzip/zstd 啥的
    PureWhiteWu
        3
    PureWhiteWu  
       2022-05-22 20:05:19 +08:00   ❤️ 1
    别用 json ,用 thrift ,直接用内存中的 bit 。
    hsfzxjy
        4
    hsfzxjy  
       2022-05-22 20:28:58 +08:00 via Android
    rkyv
    Buges
        5
    Buges  
       2022-05-22 21:15:59 +08:00 via Android
    这不是格式稳不稳定的问题,导出了你也没法用。你想想 Vec<Vec>是一系列指针组成的 Vec ,你导出去也是一堆内存地址有什么用。
    直接找个高性能二进制的序列化格式就是了,如 http://cbor.io/
    polythene
        6
    polythene  
       2022-05-22 22:01:03 +08:00
    @PureWhiteWu thrift 的这个 bit 序列化有处理大小端吗?
    timpaik
        7
    timpaik  
       2022-05-23 00:43:41 +08:00 via Android
    试试 bincode ,这个可以直接序列化,性能很不错
    PureWhiteWu
        8
    PureWhiteWu  
       2022-05-23 09:46:11 +08:00
    @polythene 有的
    klusfq
        9
    klusfq  
       2022-05-23 12:52:36 +08:00
    msgpack 是不是也不错?
    Richard14
        10
    Richard14  
    OP
       2022-05-23 17:13:44 +08:00
    @klusfq 测过,不太行
    TK4E
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3465 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.