[英]How to store dataset with protobuf
我需要紧凑地存储灵活的数据集并具有流传输功能。 数据集包含表格数据,每行包含相同的类型。
更好的方法:-用重复的原型消息编写一个大型原型消息? -多个原始消息会直接写入steram(以及一些附加信息,有关内部的原始格式)? -还是存在更好的方法?
protobuf支持流媒体吗?
您可能已经注意到,protobuf主要是用于将数据序列化/反序列化为二进制形式或从二进制形式反序列化的框架。 如果您要传输数据,则当然可以以流方式发送-毕竟只是字节。
您可以编写自己的网络协议,但是可能正在寻找类似gRPC之类的东西 (链接是C#教程-从标签中推导出)。 gRPC允许流式传输-您可以在此处了解更多信息。 快速报价:
服务器流式RPC服务器流式RPC与我们的简单示例类似,不同之处在于服务器在获取客户端的请求消息后发回响应流。 发送回所有响应后,服务器的状态详细信息(状态代码和可选状态消息)和可选尾随元数据将被发送回服务器端以完成。 客户端完成所有服务器的响应后即完成。
客户端流式RPC客户端流式RPC也类似于我们的简单示例,不同之处在于客户端将请求流发送到服务器,而不是单个请求。 服务器通常在收到客户端的所有请求后(但不一定)发送单个响应,以及其状态详细信息和可选的尾随元数据。
另外,作为一个简单的例子,请访问此页面 。 来自gRPC网站的示例:
public override async Task<RouteSummary> RecordRoute(Grpc.Core.IAsyncStreamReader<Point> requestStream,
Grpc.Core.ServerCallContext context)
{
int pointCount = 0;
int featureCount = 0;
int distance = 0;
Point previous = null;
var stopwatch = new Stopwatch();
stopwatch.Start();
while (await requestStream.MoveNext())
{
var point = requestStream.Current;
pointCount++;
if (CheckFeature(point).Exists())
{
featureCount++;
}
if (previous != null)
{
distance += (int) previous.GetDistance(point);
}
previous = point;
}
stopwatch.Stop();
return new RouteSummary
{
PointCount = pointCount,
FeatureCount = featureCount,
Distance = distance,
ElapsedTime = (int)(stopwatch.ElapsedMilliseconds / 1000)
};
}
编辑
带有gRPC定义的原始文件示例。
syntax = "proto3";
message DataRow {
// Your data row here
}
message SendDataResponse {
}
service DataAcceptor {
// Send multiple rows in a streaming scenario
rpc SendData (stream DataRow) returns (SendDataResponse) {}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.