Как хранить набор данных с помощью protobuf - PullRequest
0 голосов
/ 02 ноября 2018

Мне нужно хранить гибкие наборы данных компактно и с возможностью потоковой передачи. Набор данных содержит табличные данные, каждая строка содержит одинаковые типы.

Что лучше: написать одно большое прото-сообщение с повторными прото-сообщениями? - Несколько протосообщений записывается непосредственно в Steram (с некоторой дополнительной информацией, о формате прото внутри)? - или существует какой-то лучший способ?

Является ли поддержка protobuf потоковой передачей?

1 Ответ

0 голосов
/ 03 ноября 2018

Как вы, наверное, заметили, 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)
    };
}

EDIT

Пример прото-файла с определениями 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) {}
}
...