流式传输 protoBuf 消息的设计模式
Posted
技术标签:
【中文标题】流式传输 protoBuf 消息的设计模式【英文标题】:design pattern for streaming protoBuf messages 【发布时间】:2013-11-19 08:47:29 【问题描述】:我想将 protobuf 消息流式传输到文件中。
我有一个 protobuf 消息
message car
... // some fields
我的 java 代码会创建这个汽车消息的多个对象。
我应该如何将这些消息流式传输到文件中。
据我所知有两种方法。
有另一条消息,比如汽车
message cars
repeated car c = 1;
并让 java 代码创建一个单一的汽车类型对象,然后将其流式传输到文件中。
只需使用 writeDelimitedTo 函数将汽车消息适当地流式传输到单个文件中即可。
我想知道使用 protobuf 进行流式传输的效率更高。
什么时候应该使用模式 1,什么时候应该使用模式 2?
这是我从https://developers.google.com/protocol-buffers/docs/techniques#large-data得到的
我不清楚他们想说什么。
大型数据集
协议缓冲区不是为处理大消息而设计的。作为一个 一般经验法则,如果您处理的消息大于 每兆字节,可能是时候考虑另一种策略了。
也就是说,Protocol Buffers 非常适合处理单个消息 在一个大数据集中。通常,大型数据集实际上只是一个 小片段的集合,其中每个小片段都可能是结构化的 一块数据。即使协议缓冲区无法处理整个 立即设置,使用 Protocol Buffers 对每一部分进行大幅编码 简化您的问题:现在您只需要处理一组字节 字符串而不是一组结构。
协议缓冲区不包含对大数据的任何内置支持 因为不同的情况需要不同的解决方案。 有时一个简单的记录列表就可以了,而其他时候你可以 想要更像数据库的东西。应开发每个解决方案 作为一个单独的图书馆,因此只有需要的人需要付费 费用。
【问题讨论】:
你不应该寻找设计模式。它们是来自理想代码的东西。您应该问的是“我可以编写此代码的最简单方法是什么?”。如果这恰好是一个设计模式(或关闭),那么就使用它。否则,不要。 @chris Thanx 对于您的回复,我可以两种方式进行编码(如问题中所述)。想知道哪种方法更有效。序列化或反序列化时间、流对象大小方面的效率。 我没有回应,我只是对您的问题进行了一些小的格式更改。 【参考方案1】:看看Previous Question。大小和时间的任何差异都将是最小的 (选项 1 更快??,选项 2 更小)。
我的建议是:
-
大文件的选项 2。您逐条处理消息。
如果需要多种语言,请选择选项 1。过去,并非所有语言都支持分隔,但这种情况似乎正在改变。
其他明智的个人偏好。
【讨论】:
谢谢。你的回答内容丰富。我不知道我怎么错过了另一页:( (***.com/questions/16468369/…)以上是关于流式传输 protoBuf 消息的设计模式的主要内容,如果未能解决你的问题,请参考以下文章
使用 Protobuf-net 将大数据文件流式传输为 IEnumerable