优化RProtoBuf protobuf消息的取消嵌套

时间:2019-03-02 11:36:45

标签: r protocol-buffers rcpp

假设我们有一个.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,因此需要进行概括。完美的解决方案无需将字段名称硬编码为列即可。

0 个答案:

没有答案