码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • flatbuffer使用


    flatbuffer使用python API

      • 为什么选flatbuffer
      • git地址
      • 安装使用
      • 编译schema文件生成API
      • 使用python接口生成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
  • 相关阅读:
    pdf压缩文件怎么压缩到小于10M或5m 且文件质量不影响画质清晰度
    codeblock图形界面编程(九)基于ege库的交互设计3
    Leetcode82删除排序链表中重复元素2
    【抽样技术】CH2 简单随机抽样补充——比率估计与回归估计
    未来十年将是Web3.0发展的黄金十年
    【考研词汇训练营】Day 14 —— panini,predict,access,apologize,sense,transport,aggregation
    微服务注册到nacos,在服务列表中服务名与配置的名字不一致
    【mediasoup-sfu-cpp】4: SfuDemo:join并发布视频创建RTCTransport流程分析
    python curl2pyreqs 生成接口脚本
    大数据安全 | 【实验】凯撒加密与解密
  • 原文地址:https://blog.csdn.net/u013355191/article/details/127853773
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号