Я сериализую некоторые данные и хочу сделать размер файла как можно меньшим, не теряя при этом существенных деталей данных. Первым шагом для меня было сохранение данных в двоичном формате вместо ASCII, и я решил попробовать Flatbuffers. Ранее, когда данные были сохранены в виде текстовых файлов, они были около 400 МБ. Используя схему, показанную ниже, размер файла составляет около 200 МБ. Так что это хорошее уменьшение в размере, но меньше, конечно, будет лучше. Данные состоят из 1 из ControlParams, 82 из ControlData, и вектор интенсивности занимает большую часть пространства, являясь матрицей с размером около 128x5000. Мы уже находимся вокруг теоретического двоичного размера 128x5000 * 82 * 4 байта на float ~ 200 МБ. В целом матрицы довольно плотные, но кое-где я вижу строки, которые равны нулю. Могут ли Flatbuffers использовать эти нули для дальнейшего уменьшения размера файла? Возможно, есть другие недостатки, которые кто-то может заметить в схеме, так как я только начинаю с Flatbuffers?
Еще один способ go уменьшить размер файла - это исследовать различные вейвлеты для сжатия исходных интенсивностей с помощью , Сейчас я использую преобразование Хаара, потому что я смог создать для этого функцию C ++ и обнаружил, что возможно сжатие 2x или, возможно, 4x. Я мог бы исследовать другие вейвлеты, но хотел бы знать, пробовали ли другие вейвлеты, отличные от Хаара, и обнаружили, что они могут использовать с ними меньше коэффициентов.
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;