在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

protobuf怎么發現的?

科技綠洲 ? 來源:了不起 ? 作者:了不起 ? 2023-09-25 11:26 ? 次閱讀

最近我們在項目中,通過使用 protobuf 格式作為存儲數據的一個載體。一個不小心就給自己埋了個大坑,還是過了好久才發現。

protobuf 簡介

protobuf 全名叫 Protocal buffers. 它是由 Google 研發的,一種可跨語言、可跨平臺、可擴展的序列化數據的機制。類似于 XML ,但是它更小、更快、更簡單。你只需要定義一次你希望的數據如何被結構化,然后你可以使用它的生成工具,生成包含一些序列化和反序列化等操作的源代碼。可以輕松地從各種數據流和使用各種編程語言寫入和讀取結構化的數據。

proto2版本支持在JavaPython、Objective-C和C++中生成代碼。使用新的proto3語言版本,你還可以使用Kotlin、Dart、Go、Ruby、PHP和C#,還有更多的語言。

怎么發現的?

在我們的新項目中,我們通過使用 protobuf 格式來存儲項目運行的數據。這樣我們在調試過程中,可能根據現場錄制的數據進行本地的調試。

message ImageData {
// ms
int64 timestamp = 1;
int32 id = 2;
Data mat = 3;
}

message PointCloud {
// ms
int64 timestamp = 1;
int32 id = 2;
PointData pointcloud = 3;
}

message State {
  // ms
  int64 timestamp = 1;
  string direction = 2;
}

message Sensor {
repeated PointCloud point_data = 1;
repeated ImageData image_data = 2;
repeated State vehicle_data = 3;
}

我們定義了這樣一組數據, 然后存儲的時候,因為Sensor 這3個數據源的幀率不一樣,因此存儲的時候,單個 Sensor 中其實只包含了一組數據,另外兩個類型的數據并沒有包含進去。

當我們只錄制單個 pack 的時候,我們并沒有遇到問題。直到我們覺得單個包,不能長時間錄制,我們需要找一種解決方法來分割包 。

當時覺得這個一定是很簡單的,我們就設定了一個包達到 500M 的時候,我們就讓后面的數據存到新的包中。很順利的寫完,然后放到現場進行數據錄制。錄制一段時間之后,我們把包拿回來進行模擬測試我們的新程序。發現有些包的數據解析出來是有問題的。程序運行到一半會卡在那里不動。經過多次測試,發現是部分包有這個問題。

我們一開始懷疑的是,判斷文件大小的方式不對,影響到了分包。因為判斷文件大小的時候,會去打開文件。但是經過好幾種其他的不打開文件的方式判斷,從而進行分割。還是遇到了部分錄制的包有問題。

這時我才懷疑到 protobuf 對存儲數據會有一些特殊的要求。后來看了一些文章,了解到 protobuf 存儲多組數據到一個文件需要有標志符。要不然后面從文件解析回來的時候,protobuf 因為不知道單個數據的停止符在哪里,導致數據解析出錯。

到這里,這個坑出現了。我們存儲了一系列的數據到單個包中,沒有做任何分隔符的操作。protobuf在解析的時候,把文件中所有的內容都解析成了單個Sensor。Sensor 中包含里所有數據, protobuf 主動合并了所有存儲的數據。

在這時,我才發現以前單包錄制的時候,數據都是對的,那真的是我運氣好。protobuf恰好解析成功了。

怎么解決呢?

既然知道 protobuf 會這么操作,那我們就只要知道 protobuf 怎么分割就行了。這個方法還真不好找,因為像我們這樣使用的人太少了。中文搜索完全搜不到這一塊的內容,可能大家都不會使用protobuf來存儲數據吧,大家使用的方式應該都是多個服務中進行交互的場景吧。

最終通過stackoverflow上的一些回答找到了答案,從回答中得知,這個解決辦法在 protobuf 3.3 的時候,才正式被合并進去。看起來這個功能真的很少用啊。

bool SerializeDelimitedToOstream(const MessageLite& message,
                                                 std::ostream* output);
bool ParseDelimitedFromZeroCopyStream(
    MessageLite* message, io::ZeroCopyInputStream* input, bool* clean_eof);

通過這一對方法,可以對文件進行按照數據流一個一個的存儲讀取。再也不用擔心數據被合并讀取。

當然通過這種方式存儲的數據,不能被原來的解析方式所解析,存儲的而進行格式完全變了。這種方式會先存儲二進制數據的大小,再存儲二進制數據。

結束語

經過一番折騰,終于搞定了這個分割的坑。使用場景可能比較小眾,導致了很多資料根本找不到。靠自己看源碼才發現這些問題。C++ 的源碼真不好讀,有很多的模板方法、模板類容易錯過一些細節。最后還是看的C#的代碼,才完全確認的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程語言
    +關注

    關注

    10

    文章

    1945

    瀏覽量

    34740
  • 源代碼
    +關注

    關注

    96

    文章

    2945

    瀏覽量

    66749
  • 代碼
    +關注

    關注

    30

    文章

    4788

    瀏覽量

    68617
  • 存儲數據
    +關注

    關注

    0

    文章

    88

    瀏覽量

    14103
收藏 人收藏

    評論

    相關推薦

    【LeMaker Guitar試用體驗】8.Lemuntu系統中編譯protobuf源代碼和簡單示例

    本帖最后由 xble 于 2016-2-17 11:42 編輯 protobuf是什么東東?http://blog.csdn.net/menuconfig/article/details
    發表于 02-17 11:42

    請教關于z-stack linux gateway 中更新protobuf-c的問題

    我下載了z-stack linux gateway 然后嘗試編譯到PC機去執行,按照流程,我下載了 protobuf2.6.1版本。protobuf-c1.2.1版本,并且在ubuntu上也安裝
    發表于 08-09 08:11

    請問liunx gate編輯出錯怎么處理?

    目標平臺MTK-76281.根據手冊,需要編譯protobuf下載源碼后,./configure --build=i386-pc-linux --host=mipsel-openwrt-linux
    發表于 08-18 07:12

    Go Protobuf資源的可讀化 ,看完你就懂了

    Go Protobuf資源的可讀化 ,看完你就懂了
    發表于 06-15 09:08

    利用protobuf通信原理

    一、利用protobuf通信原理最近項目中需要用到stm32與H6(移植了linux)進行數據交互,H6端是用C++編寫的串口底層驅動,與stm32的串口連接并通信。-串口間的通信協議定為采用
    發表于 08-20 07:25

    什么是protobuf?怎么使用?

    什么是protobuf-c 之前的文章:《Protobuf:一種更小、更快、更高效的協議》詳細介紹了protobufprotobuf-c。這里再簡單提一下:Protocol Buff
    發表于 12-16 06:03

    如何去解決S5P6818交叉編譯protobuf報錯的問題

    /arm-cortex_a9-linux-gnueabi-g++ supports C++11 features with -h std=c++0x... noS5P6818交叉編譯protobuf報錯編譯器不支持C++11怎么辦開發板是OK6818-C,也可以使用嗎
    發表于 01-06 06:39

    protobuf在STM32平臺的移植使用方法

    說在前面的話 這是一篇2020年欠下的文章,一直擱置著,現在還上。之前分享了兩篇關于Protobuf的筆記:Proto...
    發表于 01-11 06:26

    protobuf是什么?protobuf有什么作用支持什么數據類型?

    protobuf是google旗下的一款平臺無關,語言無關,可擴展的序列化結構數據格式。所以很適合用做數據存儲和作為不同應用,不同語言之間相互通信的數據交換格式,只要實現相同的協議格式即同一
    發表于 09-27 16:29 ?3次下載

    深入剖析ProtoBuf原理與工程實踐

    ProtoBuf 作為一種跨平臺、語言無關、可擴展的序列化結構數據的方法,已廣泛應用于網絡數據交換及存儲。隨著互聯網的發展,系統的異構性會愈發突出,跨語言的需求會愈加明顯,同時 gRPC 也大有取代
    的頭像 發表于 11-16 09:15 ?1583次閱讀
    深入剖析<b class='flag-5'>ProtoBuf</b>原理與工程實踐

    Protocol Buffer在MCU上的實現--C語言

    一 什么是Protocol BufferProtocol Buffer是一種支持多平臺、多語言、可擴展的的數據序列化機制,相較于XML來說,protobuf更小更快更簡單,支持自定義的數據結構,用
    發表于 11-20 13:21 ?10次下載
    Protocol Buffer在MCU上的實現--C語言

    Intellij IDEA插件idea-plugin-protobuf

    ./oschina_soft/idea-plugin-protobuf.zip
    發表于 05-18 11:09 ?2次下載
    Intellij IDEA插件idea-plugin-<b class='flag-5'>protobuf</b>

    使用Protobuf實現客戶端與服務器之間的通信協議層

    本系列是關于用Rust構建一個KV Server的系列文章,內容包括用tokio做底層異步網絡通訊、使用toml文件做配置、protobuf做傳輸協議、內存/RockDB做數據存儲、事件通知、優雅關機、并發連接限制及測量監控等。
    的頭像 發表于 09-14 09:26 ?2520次閱讀

    結構化數據:ProtoBuf試用與JSON的比較

    XML、JSON 也可以用來存儲此類結構化數據,但是使用ProtoBuf表示的數據能更加高效,并且將數據壓縮得更小。
    發表于 03-08 15:43 ?1863次閱讀

    protobuf的編碼和存儲方式

    一、protobuf簡介: 1.1 protobuf的定義: protobuf是用來干嘛的? protobuf是一種用于 對結構數據進行序列化的工具,從而實現 數據存儲和交換。 (主要
    的頭像 發表于 11-09 09:27 ?1349次閱讀
    <b class='flag-5'>protobuf</b>的編碼和存儲方式
    主站蜘蛛池模板: 午夜国产精品理论片久久影院 | 天天做天天爱夜夜爽女人爽宅 | 黄 色 毛片免费| 天天干天天射天天舔| 国产亚洲精品久久yy5099| 亚州一级| 国产免费播放| 成人午夜大片免费视频77777| 在线观看精品视频看看播放| 亚洲一卡二卡在线| 狠狠躁夜夜躁人人爽天天天天 | 成人午夜亚洲影视在线观看| 伊人成人在线观看| 国产一区二区三区免费大片天美| 在线www 天堂网在线| 酒色网址| 一级日本高清视频免费观看| 国产一区二区三区在线观看视频| 狠狠干狠狠干狠狠干| 五月天福利视频| 在线观看黄a| 亚洲精品欧洲久久婷婷99| 男女免费网站| 中国美女一级黄色片| semm亚洲欧美在线高清| 日韩高清一级| 日本xxwwxxww视频免费丝袜| 在线观看视频色| yy4080一级毛片免费观看| h在线免费观看| 麦克斯奥特曼在线观看| 天天免费视频| 国产精品久久久久免费| 日本番囗| 久久人人网| 婷婷丁香九月| 视频在线精品| 五月婷婷六月天| 成人黄性视频| 国产精品福利一区| 日日摸人人拍人人澡|