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

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

1 Ответ

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

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

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

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

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

...