Могут ли Flatbuffers использовать 0 в векторах? Или другие вейвлеты лучше, чем преобразование Хаара?

Я сериализую некоторые данные и хочу сделать размер файла как можно меньше, не теряя основных деталей данных. Первым шагом для меня было сохранение данных в двоичном формате вместо ASCII, и я решил попробовать Flatbuffers. Раньше, когда данные хранились в виде текстовых файлов, они были около 400 мб. Используя схему, показанную ниже, размер файла составляет около 200 МБ. Так что это хорошее уменьшение в размере, но меньше, конечно, было бы лучше. Данные состоят из 1 ControlParams, 82 ControlData, а вектор интенсивности занимает большую часть пространства, представляя собой матрицу размером примерно 128x5000. Мы уже приблизились к теоретическому размеру бинарника 128x5000*82*4 байта на float ~ 200 мб. В целом матрицы довольно плотные, но кое-где я вижу нулевые строки. Могут ли Flatbuffers использовать эти нули для дальнейшего уменьшения размера файла? Возможно, есть и другие неэффективности, которые кто-то может заметить в схеме, так как я только начинаю работать с Flatbuffers?

Другим способом уменьшения размера файла может быть исследование различных вейвлетов для сжатия исходных интенсивностей. Сейчас я использую преобразование Хаара, потому что мне удалось создать для этого функцию C++, и я обнаружил, что возможно сжатие в 2 или, возможно, в 4 раза. Я мог бы исследовать другие вейвлеты, но хотел бы знать, пробовали ли другие другие вейвлеты по сравнению с Хааром и обнаружили ли, что они могут использовать с ними меньше коэффициентов.

namespace RTSerialization;

table ControlParams{
    extractStepSizeDa:float = 1.0005;
    smooth:bool = false;
    haarLevel:int = 10;
    deltaTimeSec:float;
}

table ControlData{
    mzAxis:[float];
    timeSec:[float];
    intensities:[float];
    scanFilter:string;
}

table ControlParamsAndData{
    params:ControlParams;
    dataSet:[ControlData];
}

root_type ControlParamsAndData;

person premes    schedule 11.01.2020    source источник


Ответы (1)


Да, ваш размер полностью определяется одним массивом float, остальная часть формата FlatBuffer совершенно не имеет отношения к вопросу о том, как его уменьшить.

И нет, FlatBuffers не выполняет никакого автоматического сжатия, поскольку вся конструкция основана на произвольном доступе. Любой доступ к вашему массиву с плавающей запятой должен быть O (1).

Таким образом, оптимизация этих данных полностью зависит от вас. Вы говорите, что данные представляют собой матрицы.. Поплавки в матрицах часто находятся в ограниченных диапазонах, например от -1 до 1, поэтому их можно квантовать в short?

Другие формы сжатия, конечно, означают, что вам придется делать собственную упаковку/распаковку.

person Aardappel    schedule 11.01.2020