![](/img/trans.png)
[英]C++ protobuf: how to write multiple messages into file by “SerializeToOstream()”
[英]c++ write protobuf incrementally to file
我有以下protobuf:
message FrameData {
... arbitrarily complex ...
}
message DataDump {
optional uint64 headerField1 = 1;
optional uint64 headerField2 = 2;
optional uint64 headerField3 = 3;
repeated FrameData frameData = 4;
}
我正在一個一個迭代地創建 frameData protobuf,我想將 DataDump protobuf 寫入文件。
我可以通過簡單地構建我的 DataDump protobuf 然后調用SerializeToOstream
來做到這一點 - 問題是數據只有幾個 100gb,這樣我需要先在 ram 中建立所有數據,然后才能將其轉儲到磁盤。
由於重復字段 frameData 是 protobuf 中的最后一個,因此我認為應該可以先將標頭寫入文件,然后在生成每個 FrameData protobuf 后迭代地輸出 frameData 的元素。
如何才能做到這一點?
可以連接 Protobuf 消息(尤其是 proto2 語法消息)以合並它們的內容。 弄清楚它究竟是如何工作的,需要閱讀protobuf 編碼格式文檔。
在您的情況下,您可以首先將帶有標頭字段的DataDump
消息寫入文件。 之后,將您想要的任意數量的項目放入frameData
並將該消息附加到文件的末尾。 重復直到所有項目都已寫入。
當解碼器讀取消息時,它看起來好像所有項目都是大frameData
數組的一部分。
但是,這在解碼方面可能是一個問題:在許多實現中,這會迫使您一次將整個文件讀入內存,而不是將它們分成較小的塊進行處理。
特別是如果您想要隨機訪問和某種索引,存儲數百 GB 的數據集可以從更高級的存儲格式中受益。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.