• flatbuffer使用


    为什么选flatbuffer

    FlatBuffers 是一个序列化开源库,实现了与 Protocol Buffers,Thrift,Apache Avro,SBE 和 Cap’n Proto 类似的序列化格式,

    主要由 Wouter van Oortmerssen 编写,并由 Google 开源。Oortmerssen 最初为 Android 游戏和注重性能的应用而开发了FlatBuffers。

    现在它具有C ++,C#,C,Go,Java,PHP,Python 和 JavaScript 的端口。

    git地址

    [https://github.com/google/flatbuffers.git]

    安装使用

    https://github.com/google/flatbuffers/releases
    这里有编译好的版本,下载对应文件解压即可使用

    先创建自己的schema文件

    namespace parameters;
    table ParameterData
    {
        name:string;
        size:int;
        data:[float];
    }
    table Parameters
    {
        name:string;
        data:[ParameterData];
    }
    root_type Parameters;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    编译schema文件生成API

    flatc --python --gen-object-api ./schema.fbs

    执行完以上命令会生成一个描述文件,定义好了上述两个Table的实现

    使用python接口生成flatbuffer文件,保存到文件:

    from parameters import Parameters, ParameterData
    builder = flatbuffers.Builder(0)
     
    param1 = builder.CreateString('emb_weight')
    weight=np.array([1.0, 2.0, 3.0, 4.0, 5.0], np.float32)
    bytesweight = weight.tobytes()
    float_w = np.frombuffer(bytesweight, dtype=weight.dtype)
    ParameterData.ParameterDataStartDataVector(builder, len(bytesweight))
     
    #We need to seek the header to correct place before writing into Bytes array.
    builder.head = builder.head - len(bytesweight)
    builder.Bytes[builder.head : (builder.head + len(bytesweight))] = bytesweight
    data = builder.EndVector()
     
    ParameterData.ParameterDataStart(builder)
    ParameterData.ParameterDataAddName(builder, param1)
    ParameterData.ParameterDataAddSize(builder, 5)
    ParameterData.ParameterDataAddData(builder, data)
    allparameter = ParameterData.ParameterDataEnd(builder)
     
    Parameters.ParametersStartDataVector(builder, 1)
    builder.PrependUOffsetTRelative(allparameter)
    params = builder.EndVector()
    domain_name = builder.CreateString("domain")
     
    Parameters.ParametersStart(builder)
    Parameters.ParametersAddName(builder, domain_name)
    Parameters.ParametersAddData(builder, params)
    all_params = Parameters.ParametersEnd(builder)
    builder.Finish(all_params)
     
    buf = builder.Output()
    with open("parameters.bin", mode="wb") as f:
        f.write(buf)```
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    解析文件:

    rbuf = open('parameters.bin', 'rb').read()
    rbuf = bytearray(rbuf)
    resparam = Parameters.Parameters.GetRootAsParameters(rbuf, 0)
    print("resparam--", resparam.Name())
    print("resparam-data-name-", resparam.Data(0).Name())
    print("resparam-data-size-", resparam.Data(0).Size())
    print("resparam-data-length-", resparam.Data(0).DataLength())
    for i in range(resparam.Data(0).Size()):
        print("resparam-data--", i, resparam.Data(0).Data(i))
     
    代码输出结果如下:
    resparam-data-name- b'emb_weight'
    resparam-data-size- 5
    resparam-data-length- 20
    resparam-data-- 0 1.0
    resparam-data-- 1 2.0
    resparam-data-- 2 3.0
    resparam-data-- 3 4.0
    resparam-data-- 4 5.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    MySQL第四讲·如何正确设置主键?
    Redis原理篇——五种基本数据类型
    C++:多态
    【构建并发程序】2-线程池-的注意事项与缺点
    Linux系列之管理用户环境变量
    守护线程?
    可编程交易区块为DeFi机器人提供强大动力
    Unity实战篇 | 游戏中控制 地图无限自动化生成 的方法,进一步优化项目
    12月1日(第三天)
    HLS入门实践
  • 原文地址:https://blog.csdn.net/u013355191/article/details/127853773