繁体   English   中英

如何使用protobuf存储数据集

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM