Оптимизировать удаление сообщений из протокола RProtoBuf - PullRequest
0 голосов
/ 02 марта 2019

Допустим, у нас есть .proto файл с вложенной полезной нагрузкой:

syntax = "proto3";

package optimize_nesting;

message TestPayload {
  int32 a = 1;
  int32 b = 2;
}

message NestedPayload {
    repeated TestPayload nested = 1;
}

Один из способов удаления сообщения - это подмножество с [[]], но это не обобщает / не масштабирует дослучаи с гораздо более чем двумя вложенными полями.Другой может быть:

RProtoBuf::readProtoFiles("reprex.proto")

p <- optimize_nesting.NestedPayload$new(nested = list(
  optimize_nesting.TestPayload$new(a = 123,
                                   b = 456),
  optimize_nesting.TestPayload$new(a = 000,
                                   b = 999)
))

map_df(p[["nested"]], ~tibble(a = .[["a"]],
                              b = .[["b"]]))

## using [[]]
  tibble(a = c(p$nested[[1]][[1]], 
               p$nested[[1]][[2]]),
         b = c(p$nested[[2]][[1]], 
               p$nested[[2]][[2]]))

# A tibble: 2 x 2
      a     b
  <dbl> <dbl>
1   123   456
2     0   999

Некоторые контрольные показатели:

Unit: microseconds
      expr      min        lq      mean   median
     purrr 1014.667 1125.5450  1689.671 1280.791
      base  487.676  514.3695  583.3068  532.079

Является ли это самым быстрым способом перехода от вложенных сообщений к работоспособному столу?Должно ли это быть сделано в Rcpp вместо этого?

Пожалуйста, примите во внимание, что NestedPayload может включать в себя несколько типов сообщений, а не только TestPayload, как показано здесь, поэтому его необходимо обобщить.Идеальное решение будет работать без жесткого кодирования имен полей в виде столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...