Я сериализую некоторые данные и хочу сделать размер файла как можно меньше, не теряя основных деталей данных. Первым шагом для меня было сохранение данных в двоичном формате вместо 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;