2015-03-31 41 views
1

完全解析我用於定義一個proto文件,例如讀原部分地,而不是在Java

option java_package = "proto.data"; 
message Data { 
    repeated string strs = 1; 
    repeated int ints = 2; 
} 

我從網絡接收到的該對象的輸入流(或字節)。然後,通常我會執行像Data.parserFrom(stream)Data.parserFrom(bytes)這樣的解析來獲取對象。由此,我不得不在數據對象上保存完整的內存,而我只需要在對象中傳送所有字符串和整數值。當對象大小很大時很糟糕。

該怎麼辦?

回答

1

不幸的是,沒有辦法解析protobuf的一部分。如果你想確定你已經看到全部strs所有ints,你必須解析整個消息,因爲值可能以任何順序出現甚至交錯。

如果你只關心內存使用情況而不關心CPU時間,那麼理論上你可以使用手寫解析器來解析消息並忽略你不關心的字段。你仍然需要做解析工作,你可以立即丟棄它們,而不是將它們保存在內存中。但是,要做到這一點,你需要研究Protobuf wire format並編寫自己的解析器。您可以使用Protobuf的CodedInputStream類,但仍需要手動完成大量工作。 Protobuf庫確實不是爲此設計的。

如果您願意考慮使用不同的協議框架,Cap'n Proto在設計上與Protobufs非常相似,但功能僅能夠讀取您關心的部分消息。 Cap'n Proto對沒有檢查的字段沒有任何開銷,除了明顯的帶寬和內存接收原始消息字節。如果您正在讀取文件,並使用內存映射(Java中爲MappedByteBuffer),則只有實際使用的消息部分將從磁盤讀取。

(披露:我的大多數谷歌Protobufs V2(您可能正在使用的版本),以及頭兒原的作者。)

相關問題