Google flabtbuffer Как поместить массив в структуру в файле fbs - PullRequest
0 голосов
/ 13 февраля 2020

Это расширение к следующему вопросу Размер сериализированных данных не уменьшается при использовании плоского буфера

Как уже упоминалось в ответе, чтобы уменьшить пространство, мы должны использовать Struct. Но в моем случае мне нужно определить idl-файл для Polygon

Каждый полигон будет иметь пять или более точек, и у меня будет другой DS, который будет иметь массив полигонов. Я определил свой файл fbs следующим образом

namespace MyFlat;

struct Vertices {
    x : double;
    y  :double;

}
table Polygon  {

    polygons : [Vertices];
}

table Layer {

    polygons : [Polygon];
}


root_type Layer;

Как и ожидалось, мой сериализованный размер данных становится достаточно большим. Есть ли способ оптимизировать заполнение таблицы, чтобы уменьшить размер сериализованного буфера

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Спасибо за ваш ответ. Но когда я пытаюсь напечатать размер 100 полигонов с вершинами 5, размер составляет около 10,24 КБ. В идеале размер должен быть около 8000 байт (8 КБ)

b := flatbuffers.NewBuilder(0)
var polyoffset []flatbuffers.UOffsetT
size := 100

StartedAtMarshal := time.Now()
for k := 0; k < size; k++ {
    MyFlat.PolygonStartPolygonsVector(b, 5)
    for i := 0; i < 5; i++ {
        MyFlat.CreateVertices(b, 2.0, 2.4)
    }

    vec := b.EndVector(5)
    MyFlat.PolygonStart(b)
    MyFlat.PolygonAddPolygons(b, vec)
    polyoffset = append(polyoffset, MyFlat.PolygonEnd(b))
}

MyFlat.LayerStartPolygonsVector(b, size)
for _, offset := range polyoffset {
    b.PrependUOffsetT(offset)
}
vec := b.EndVector(size)
MyFlat.LayerStart(b)
MyFlat.LayerAddPolygons(b, vec)
finalOffset := MyFlat.LayerEnd(b)

b.Finish(finalOffset)

EndedAtMarshal := time.Now()
fmt.Println("Elapes Time for Seri", EndedAtMarshal.Sub(StartedAtMarshal).String())
    mybyte := b.FinishedBytes()
    fmt.Println(len(mybyte))

Это ожидаемый размер или Моя реализация неверна

0 голосов
/ 13 февраля 2020

Здесь нет необходимости дополнительно оптимизировать структуру ваших данных, так как> 90% * размера этих буферов, как правило, будет использоваться Vertices.

Одна вещь, которую следует учитывать, это использовать float для x и y, учитывая, что вам вряд ли понадобится дополнительное разрешение ... это почти вдвое меньше размера вашего буфера.

...