【问题标题】:Efficient encoding alternatives for Map<String,String> in Protocol Buffers协议缓冲区中 Map<String,String> 的有效编码替代方案
【发布时间】:2020-06-20 14:39:11
【问题描述】:

我有一个 protob 消息来编码键值字符串对。我想知道最好的消息布局是什么。

为了更清楚,我使用的最基本的实现是

message KeyValPair{
   string key = 1;
   string val = 2;
}

message KeyValPairSet{
   repeated KeyValPair dict = 1;
}

另一种选择是:

message KeyValPair{
   map<string,string> dict = 1;
}

对于我的用例,键值对的数量始终是固定的。 我需要将这些消息用作 gRPC 服务的一部分,并希望得到一种消息格式的提示,该格式的解析和传输时间最短。

我的客户端用 Java 实现,服务器端用 Go 实现。

【问题讨论】:

  • 在电线级别,您建议的两件事是相同的。不过,map 选项在大多数实现上可能具有更好(更具体)的处理能力。
  • 哦。谢谢迈克

标签: protocol-buffers grpc grpc-java grpc-go


【解决方案1】:

你说对数是固定的。大多数情况下,对的数量是固定的,这意味着键是可预测的。在那种的情况下,最好的办法是明确说明它们,这样你就永远不会发送密钥(只是标签号):

message MyThing {
    string foo =1;
    string bar = 2;
    // ...
    string blap = 42;
}

如果密钥不是实际上是可预测的,那么:map&lt;string,string&gt;。这与编码后的重复键/值对消息相同,但在许多实现中可能具有更具体/更直接的支持。

您总是可以将两者结合起来,因此将string 字段组合用于已知/可预测的键,将map&lt;string, string&gt; 用于未知的附加键。

【讨论】:

  • 所以 Marc 如果我使用重复的字符串作为字段而不是使用单独的字段,它会比你建议的要慢吗?
  • @DaintyLord 问题是;您是否将密钥作为字符串发送?单独的字段:不
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多