【问题标题】:How to store dataset with protobuf如何使用 protobuf 存储数据集
【发布时间】:2018-11-03 10:05:30
【问题描述】:

我需要紧凑地存储灵活的数据集并具有流式传输的能力。 数据集包含表格数据,每一行包含相同的类型。

什么更好: - 用重复的原始消息编写一个大的原始消息? - 多个原始消息直接写入 steram(带有一些附加信息,关于内部原始格式)? - 还是有更好的方法存在?

protobuf 是否支持流式传输?

【问题讨论】:

  • 您好我同样需要发送数据集对象并接收数据集。你找到 gRPC 的方法了吗?谢谢
  • @VAAA 我们为结构添加了分页兼容性。
  • 有没有办法让我看到一个示例,说明您如何将 gRPC 与 .NET 数据集类型一起使用?欣赏它

标签: serialization protocol-buffers protobuf-net data-stream


【解决方案1】:

您可能已经注意到,protobuf 主要是一个用于将数据序列化/反序列化为二进制形式的框架。如果您希望传输该数据,您当然可以以流式传输方式发送它——毕竟它只是字节。

您可以编写自己的网络协议,但您可能正在寻找类似gRPC 的东西(链接到 C# 教程 - 从您的标签中推断)。 gRPC 允许流式传输 - 您可以了解更多关于它的信息 here。快速报价:

服务器流式 RPC 服务器流式 RPC 类似于我们简单的 例如,除了服务器在之后发回响应流 获取客户端的请求消息。在发回所有的 响应,服务器的状态详细信息(状态代码和可选 状态消息)和可选的尾随元数据被发送回 在服务器端完成。客户端在完成所有操作后完成 服务器的响应。

客户端流式 RPC 客户端流式 RPC 也类似于我们的 简单的例子,除了客户端向 服务器而不是单个请求。服务器发回一个 响应,通常但不一定在收到所有 客户的请求,以及其状态详细信息和可选的尾随 元数据。

另外,如需简单示例,请访问this page。来自 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 定义的示例 proto 文件。

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

【讨论】:

  • 这个网站很好,我刚读过它,但是当发送一个非类型化的数据集时,不需要声明任何东西对吗?因为只是一个流不是吗?
猜你喜欢
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多