2016-01-24 38 views
-1

我正在研究將高度自定義且高效的二進制格式遷移到其中一種可用二進制格式。數據存儲在其他地方的一些低功率移動設備上,因此性能是重要的要求。 當前格式的優點是所有字符串都存儲在一個池中。這意味着我們在文件中不會重複相同的字符串一百次,在反序列化過程中我們只讀取一次,所有對象都通過它的索引引用它。這也意味着我們在內存中只保留一個副本。所以很多優點:) 我無法找到capnproto或flatbuffers支持此方法。或者我需要在頂層構建圖層,並且在生成的對象中顯式使用整數索引來顯示字符串?是否存在允許字符串緩存的現成二進制格式

謝謝你!

+1

爲什麼問題是downvoted?正如我們所看到的,在他們的手冊中沒有關於這方面的明確信息。 – MichalMa

回答

1

FlatBuffers支持字符串池。只需簡單地序列化一個字符串,然後在其他對象中多次引用該字符串。該字符串將只出現在內存中一次。

最簡單的例子,模式:

table MyObject { name: string; id: string; } 

代碼(C++):

FlatBufferBuilder fbb; 
auto s = fbb.CreateString("MyPooledString"); 
// Both string fields point to the same data: 
auto o = CreateMyObject(fbb, s, s); 
fbb.Finish(o); 
+0

我在文檔中錯過了關於這方面的信息嗎? – MichalMa

+0

它隱含在「內部」部分,但可能更清楚,是的。 – Aardappel

+0

@Aardappel我想Flatbuffers不會抵禦[放大攻擊](https://capnproto.org/encoding.html#amplification-attack)? –

1

你總是可以做到這一點手動,如:

struct MyMessage { 
    stringTable @0 :List(Text); 

    # Now encode string fields as integer indexes into the string table. 
    someString @1 :UInt32; 
    otherString @2 :UInt32; 
} 

頭兒原在理論上可以允許多個指針指向相同的對象,但出於安全原因目前禁止這個指針:這太容易了通過發送循環消息或包含大量重疊引用的消息,DoS服務器不期望它。 See the section on amplification attacks in the docs.

相關問題