【问题标题】:Google protobuf and large binary blobsGoogle protobuf 和大型二进制 blob
【发布时间】:2014-04-14 01:34:33
【问题描述】:

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

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

虽然我的大部分消息只是一些控制和状态信息,但应该有一个选项来设置要传输的数据块或请求要接收的数据块。这些数据块通常在 5-10MB 的范围内,但也应该可以使用高达 100MB 的更大的块。

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

所以问题是,它实际上会有多糟糕?会有哪些负面影响?我真的不想将整个通信都建立在 protobuf 上,结果却发现它不起作用。

【问题讨论】:

    标签: protocol-buffers rpc


    【解决方案1】:

    坦率地说,本身库并不是按照您可能希望它用于处理大型消息的方式设计的,而不是性能。例如,您必须一次解析一条消息,并一次将其全部序列化。因此,如果您有一条包含 100MB blob 的消息,则您无法读取该消息的任何部分,除非您读取整个 100MB 并在解析时阻塞调用线程。另一个问题是 100MB blob 将被分配为一个巨大的平面字节数组。在 64 位系统上,这可能没问题,但在 32 位系统上,您可能会遇到地址空间碎片问题。最后,有一个硬性的消息大小限制为 2GB。

    如果你对这些问题没问题,那么你几乎可以做到。您将不得不手动覆盖出于安全目的默认为 64MB 的消息大小限制。为此,您需要手动构造一个CodedInputStream 并在从中解析消息之前调用SetTotalBytesLimit()。

    但我个人建议尝试设计您的系统,以便可以将大块分成小块。

    【讨论】:

    • 分块是推荐的方法:协议缓冲区非常适合处理大型数据集中的单个消息。通常,大型数据集实际上只是小片段的集合,其中每个小片段都可能是结构化的数据片段。尽管 Protocol Buffers 不能一次处理整个集合,但使用 Protocol Buffers 对每个片段进行编码可以大大简化您的问题:现在您所需要的只是处理一组字节字符串而不是一组结构。 - @987654322 @
    • @SBalough 确实,我写了那篇文章。 :)
    • 我想通过协议缓冲区发送图像。它们并不大,可能 50kb 到 100kb(最大 2MB)。 protobuf 是不是一个不合适的工具?
    • @speedplane 如果你把它们放在bytes-typed 字段中应该没问题。
    【解决方案2】:

    我没有时间为你做这件事,但我会浏览Protobuf source code。更好的是,继续使用大的 bytes 字段编写代码,从源代码构建 protobuf,然后在调试器中逐步执行它以查看发送和接收大 blob 时会发生什么。

    根据经验,我可以告诉您,除非具有 [packed=true] 属性,否则大型 repeated Message 字段效率不高,但这仅适用于原始类型。

    我的直觉是,大的bytes 字段会很有效,但这完全没有根据。

    你也可以绕过 Protobuf 处理你的大块:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      相关资源
      最近更新 更多