2012-11-13 98 views
2

我正在研究一個小型設備,它具有從PC軟件生成的相當大的一組配置參數(〜100 KB)。在過去,我們已經將參數存儲在二進制文件中,並將它們加載到數據結構中。維護有點煩人(不同的語言,確保結構中字段的順序匹配,不同的版本等),所以我們正在考慮去Google協議緩衝區。Google協議緩衝區的典型內存空間使用情況如何?

從小設備的角度來看,我關心的是存儲串行化協議緩衝區所需的內存空間。我在C工作,所以我下載protobuf-embedded-c並開始研究一個例子。我對它正在計算的緩衝區的最大大小感到有點驚訝。例如,接下來是一個空的緩衝區的大小,然後緩衝器包含命名類型的單個變量:

#define MAX_M_Empty_SIZE 2 
#define MAX_M_double_SIZE 12 
#define MAX_M_float_SIZE 8 
#define MAX_M_int32_SIZE 14 
#define MAX_M_int64_SIZE 14 
#define MAX_M_uint32_SIZE 9 
#define MAX_M_uint64_SIZE 14 
#define MAX_M_sint32_SIZE 9 
#define MAX_M_sint64_SIZE 14 
#define MAX_M_fixed32_SIZE 8 
#define MAX_M_fixed64_SIZE 12 
#define MAX_M_sfixed32_SIZE 8 
#define MAX_M_sfixed64_SIZE 12 
#define MAX_M_bool_SIZE 5 

每次加入一個「INT32」的結構中,最大尺寸增加了14個字節。我知道這包括關鍵字,可能是Variant上編碼的最壞情況,但我可以期待什麼呢?大消息比小消息更有效,還是更依賴於編碼值?

總之,我只是想了解協議緩衝區上的內存空間使用情況。我討厭易於使用的交易,因爲存儲配置數據所需的內存空間大量增加。謝謝!

回答

1

int32被寫爲varint,這意味着對於正值,它所需的空間取決於幅度。小的正值可以是單字節;較大的正值可能需要更多。負值需要更多的空間 - 特別是,需要使用相同數量的非常大的64位號碼。 「varint」是7位加連續;所以一個負數(或一個大的正數)可能需要10個字節。爲了避免這種情況,如果你知道你的價值觀可能是負的,你可以使用sint32/sint64 - 這款採用曲折編碼(然後varint) - 這基本上使得小幅度值會比大幅度更少的空間值(不管符號)。

如果您需要針對最壞情況進行優化,那麼可以考慮使用fixed32/fixed64代替;這保證了完全採用4或8個字節。

總結:

  • 總是(或幾乎總是)陽性,和通常的小到中等尺寸:int32/int64
  • 正或負的,並且通常小到中等大小的: sint32/sint64
  • 大的值,或需要保證大小:fixed32/fixed64

還有一些其他的;全部細節都在language guide

(在所有情況下上述,您還需要包含頭文件,但通常爲1或2個字節)