Размер сериализированных данных не уменьшается при использовании плоского буфера - PullRequest
1 голос
/ 29 января 2020

Я написал следующий файл fbs

тестирование пространства имен;

table polygon {
    x : double;
    y  : double;

}

table layer {
    layer_name : string;
    polygons : [polygon];
}

root_type layer;

Мой план состоит в том, чтобы сериализовать около 5 миллионов координат и поместить их в один файл. Проблема в том, что я вижу, что количество байтов увеличено по сравнению с тем, что я ожидал. Я ожидаю, что это должно быть arounf (5M * 16) байтов. Но размер, который я получаю, составляет 140000032 байта

Вот код java, который я использую для сброса сериализованных данных в файл.

FlatBufferBuilder fbb = new FlatBufferBuilder(0);
    String s = "Product1";
    int str = fbb.createString("layer1");
    int size = 1 * 5 * 1000000;
    int[] offset = new int[size];
    int cur = 0;

    for (double i = 0; i < size; i++) {

        fbb.startTable(2);
        polygon.addX(fbb, i);
        polygon.addY(fbb, i);
        offset[cur++] = polygon.endpolygon(fbb);
    }

    int arrayoffset = layer.createPolygonsVector(fbb, offset);
    layer.startlayer(fbb);

    layer.addLayerName(fbb, str);

    layer.addPolygons(fbb, arrayoffset);
    int bla = layer.endlayer(fbb);

    fbb.finish(bla);
    ByteBuffer bf = fbb.dataBuffer().duplicate();

    File myfile = new File("/tmp/test.dat");

    try {
        FileChannel channel = new FileOutputStream(myfile).getChannel();
        channel.write(bf);
        channel.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

Пожалуйста, дайте мне знать, если я я делаю что-то здесь не так

1 Ответ

1 голос
/ 29 января 2020

изменить table polygon на struct polygon. table является расширяемым и имеет фиксированные накладные расходы на элемент, а также упоминается вектором по смещению. struct не является расширяемым (что кажется подходящим для пары xy), его необходимо сериализовать внутри строки (см. Пример в руководстве), и он даст вам ожидаемый размер.

...