Сжатие структуры данных в плоском буфере увеличивает размер файла?

Я пытался оптимизировать размер своего плоского буфера, создав сжатую схему для наиболее повторяющейся структуры, которая у меня есть (используя только 20 бит LSB целых чисел и нарезая их на 64-битные слова), результат не тот, что я ожидал: размер файла немного вырос вместо резкого сжатия, которого я ожидал, почему моя структура 2 ulong + 1 uint (2-й случай) ниже занимает больше места, чем явная структура (1-й случай) в сгенерированном файле? В моем примере файл размером 2,4 МБ с явной структурой стал размером 2,6 МБ с использованием сжатого файла....

Explicit Struct, прямой доступ к полям:

table VObject {
    m_field1:uint; 
    m_field2:uint;
    m_field3:ushort;
    m_field4:ushort;
    m_field5:uint;
    m_field6:uint;
    m_field7:uint;
    m_field8:uint;
}  

Сжатая структура, требуется кодирование и декодирование с использованием 20- и 16-битных масок:

table VObject {
    m_field1:ulong; 
    m_field2:ulong;
    m_field3:uint;
}

person Alain Marcel    schedule 29.06.2017    source источник


Ответы (1)


Первый имеет 28 байтов полей, а второй 20. Однако смешивание ulong и uint часто приводит к тому, что uint требует заполнения выравнивания, поэтому часто становится 24 байта. С первым такой проблемы нет, потому что два ushort всегда идут вместе.

Все-таки второй должен быть меньше. Трудно сказать, что происходит, не видя, какие данные вы храните, сколько их и т. д.

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

Еще один трюк со сжатием, который вы можете попробовать, — это использовать struct вместо table. Это не будет хранить виртуальную таблицу, поэтому может быть немного меньше, но всегда сохраняет все поля и не может быть изменено после определения.

Идя еще дальше, может помочь использование вектора для каждого поля, а не вектора структур.

person Aardappel    schedule 29.06.2017