当前位置: 首页 > 知识库问答 >
问题:

谷歌协议和大型二进制blob

厉令
2023-03-14

我正在构建一个软件来远程控制连接到另一台PC的无线电硬件。

我计划使用ZeroMQ进行传输,并使用类似于RPC的请求-回复,其上有表示操作的不同消息。

虽然我的大多数消息只是一些控制和状态信息,但应该可以选择设置要传输的数据blob或请求要接收的数据blob。这些数据blob通常在5-10MB的范围内,但也应该可以使用最大100MB的较大blob。

对于消息格式,我发现google协议缓冲区非常有吸引力,因为我可以在传输链路上定义一种消息类型,该类型具有所有命令和响应的可选元素。然而,protobuf FAQ指出,如此大的消息将对性能产生负面影响。

所以问题是,这到底有多糟糕?预计会有什么负面影响?我真的不想把整个通信都建立在protobuf上,结果却发现它不起作用。

共有2个答案

堵乐
2023-03-14

我没有时间为您做这件事,但我会浏览原型源代码。更好的是,继续使用大型bytes字段编写您的代码,从源代码构建原型,并在调试器中逐步完成它以查看发送和接收大型blob时会发生什么。

根据经验,我可以告诉您,大型重复消息字段没有效率,除非它们具有[packed=true]属性,但这仅适用于基本类型。

我的直觉是,大的字节字段将是有效的,但这是完全没有根据的。

您还可以为您的大型blob绕过Protbuf:

message BlobInfo {
    required fixed64 size;
    ...
}

message MainFormat {
    ...
    optional BlobInfo blob;
}

然后您的解析代码如下所示:

...
if (message.has_blob()) {
    uint64_t size = msg.blob()->size();
    zmqsock.recv(blob_buffer, size);
}

阎枫涟
2023-03-14

坦率地说,这与其说是html" target="_blank">性能本身,不如说是库的设计方式不适合处理大型消息。例如,您必须一次解析一条消息,然后一次序列化它。因此,如果您有一条包含100MB blob的消息,那么您无法读取消息的任何部分,除非您读取整个100MB并在解析时阻止调用线程。还有一个问题是,100MB blob将被分配为一个巨大的扁平字节数组。在64位系统上,这可能很好,但在32位系统上,可能存在地址空间碎片问题。最后,有一个2GB的硬消息大小限制。

如果你对这些问题没有意见,那么你几乎可以这么做。您必须手动覆盖邮件大小限制,出于安全目的,该限制默认为64MB。为此,您需要手动构造一个CodedInputStream,并在解析消息之前对其调用SetTotalBytesLimit()。

但就我个人而言,我建议尝试设计您的系统,以便可以将大Blob拆分为小块。

 类似资料:
  • 我们说,要实现 Memcached 的 GET, SET, 和 DELETE 操作。我们仅仅关注这些,但 memcached 协议有一个通用的结构,只有少数参数改变为了改变一个请求或响应的意义。这意味着您可以轻松地扩展实现添加其他命令。一般协议有 24 字节头用于请求和响应。这个头可以分解如下表14.1中。 Table 14.1 Sample Memcached header byte struc

  • 当使用带有base64数据的PUT请求上传到Google cloud storage时,图像(PNG)不会在浏览器中显示,并表示它包含错误(在FF中查看时)。 根据我在网上读到的东西,我觉得这是可能的,但我找不到任何例子来说明它是如何用PUT来完成的,以表明它工作时缺少什么。

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我想知道的优点和缺点 Google协议缓冲区 JSON格式 XML格式 我想为两个应用程序实现一个通用框架,一个在Perl中,第二个在Java中。因此,希望创

  • 问题内容: “数据:” URL方案值是否有大小限制?我对流行的Web浏览器中的限制感兴趣。换句话说,多久可以成为或? 问题答案: 简短答案:数据URI限制有所不同。 有很多答案。正如5年前提出的问题一样,大多数问题由于过时而现在不正确,但是这个问题排在Google结果“数据URI限制”的顶部。数据URI现在得到广泛支持,并且IE 7/8不再是相关的浏览器。下面有许多参考文献,因为今天的答案是微妙的

  • 如何定制协议 实际上制定自己的协议是比较简单的事情。简单的协议一般包含两部分: 区分数据边界的标识 数据格式定义 一个例子 协议定义 这里假设区分数据边界的标识为换行符”\n”(注意请求数据本身内部不能包含换行符),数据格式为Json,例如下面是一个符合这个规则的请求包。 {"type":"message","content":"hello"}   注意上面的请求数据末尾有一个换行字符(在PHP中

  • 我正在尝试使用Prorobuf使用RpcChannel和RpcController生成服务。我参考了谷歌Prorobuf的语言指南,并且: 我有这样的示例原始文件: 语法=“proto2”; 然后我用以下代码进行编译: 我有. h和. cc文件。但是当我搜索生成的代码时,我只找到了“请求”和“响应”的类,而没有找到“搜索服务”的类: 语言指南网页提供了一个示例(https://developers