Эффективный алгоритм сжатия массива float'ов и int'ов?
Попробовал LZS:
для случайного массива байтов получил сжатие почти в полтора раза. Например, 6000 байтов сжало в 4200
для массива точек в трехмерном пространстве в float32 при случайных позиций сжало в 1.7 раза, тем более при равномерном расположении точек (в виде регулярной сетки) показало сжатие более, чем в 6 раз.
Вопрос в следующем: есть более подходящие алгоритмы сжатия для float массива, и есть ли еще какие-то хаки для уменьшения размеров массива без существенных потерь данных?
Пока в мыслях такой вариант: float можно перевести в half, а так как чем больше число, тем меньше точность, и много точек находится рядом друг с другом, поэтому компенсировать это можно таким образом:
позиция каждой точки, начиная со второй, будет вычисляться как сумма наших half-float данных позиции с позицией предыдущей точки, которая уже преобразована в float
Также стоит добавить, что эти данные описывают 3D модель (вершинные и индексные буферы), пока посмотрю какие для 3D моделей есть решения, но не совсем уверен в том, что это подойдет, так как нужны такие массивы:
вершинный буфер - массив из 3*n float элементов, где n - количество вершин
индексный буфер - массив из 3*m int элементов (все значения меньше чем n), где m - количество треугольников
текстурный буфер - массив из 6*n float элементов
Еще главное то, что буферы небольшие (например, на вершинный приходится не более 30к float элементов, а чаще всего 10к, это примерно 40 кб)
Информация - это энтропия. Чем более полно Вы заложите в алгоритм сжатия мета-ифнормацию о входном потоке (статистику, центры масс, корреляции между соседними значениями, корреляции в пакетах и т.п.), тем лучше будет среднестатистический коэффициент сжатия на больших объемах. Расскажите о Ваших реальных данных ?
один буфер - координаты вершин в трехмерном пространстве.
второй - тройка индексов этих вершин, по которым строится треугольник
Например для модели можно сказать, что расстояния между вершинами может значительно отличаться, а в буфере индексов часто повторяются пары индексов, хотя в разной последовательности
Рекомендую послушать подкаст #44 автора проекта Akumuli (БД для хранения временных рядов, TSDB). Он рассказывает разные интересные вещи о хранении данных, в том числе о хранении массивов чисел.