Существуют ли какие-либо инструменты, специально предназначенные для сжатия научных данных с плавающей запятой?
Если функция гладкая, очевидно, что числа, представляющие эту функцию, сильно коррелируют, поэтому данные должны хорошо сжиматься. Однако сжатие двоичных данных с плавающей запятой не сжимает их так хорошо. Мне интересно, есть ли метод, специально разработанный для сжатия данных с плавающей запятой.
Требования:
Сжатие без потерь или возможность указать минимальное количество сохраняемых цифр (для некоторых приложений
double
может быть больше, чем нам нужно, ноfloat
может не хватать точности).Хорошо проверенный рабочий инструмент (т.е. не просто статья, описывающая теоретический метод).
Подходит для сжатия 1D числовых данных (таких как временной ряд)
Кроссплатформенность (должна работать на Windows)
Это должно быть быстро - желательно не намного медленнее, чем gzip. Я обнаружил, что, если у меня есть числа, сохраненные как ASCII, сжатие файла может ускорить чтение и обработку его (поскольку операция может быть связана с вводом / выводом).
Я особенно хотел бы услышать от людей, которые фактически использовали такой инструмент.
источник
Ответы:
Попробуйте Blosc . Во многих случаях это быстрее, чем memcopy . Подумайте об этом на секунду. , , злой.
Это супер стабильный, высоко проверенный, кроссплатформенный, и работает как чемпион.
источник
Я получил хорошие результаты, используя HDF5 и его фильтр GZIP.
HDF5 также предоставляет фильтр SZIP, который обеспечивает лучшие результаты для некоторых научных наборов данных.
По моему опыту, выбор компрессий сильно зависит от вида данных, и сравнительный анализ, вероятно, является единственным способом сделать правильный выбор.
Кстати, сторонние фильтры для HDF5 включают BLOSC, BZIP2, LZO, LZF, MAFISC.
источник
В зависимости от лежащей в основе функции вы сможете безошибочно согласовать данные с функциональной формой, требуя меньше коэффициентов для описания функциональной формы, чем у вас есть точка данных (что приводит к сжатию). Результаты ошибок существуют для некоторых из этих методов, хотя я не знаю, даст ли какой-либо из них априорные (или апостериорные ) оценки или оценки ошибки.
Вы также можете взглянуть на методы, разработанные специально для сжатия чисел с плавающей запятой, такие как FPC и связанные алгоритмы. Смотрите статьи здесь , здесь , здесь , здесь и здесь , вместе с веб-страницей, содержащей старый исходный код здесь .
источник
HDF5 может использовать алгоритм «тасования», в котором байты для N чисел с плавающей запятой переставляются так, что сначала идут первые байты из N чисел, затем 2-й и т. Д. Это дает лучшие коэффициенты сжатия после применения gzip, так как более вероятно, что получатся более длинные последовательности с одинаковым значением. Смотрите здесь для некоторых ориентиров .
источник
SZ (разработанный Argonne в 2016 году) может быть хорошим выбором.
SZ: быстрый ограниченный ошибками компрессор с плавающей точкой для научных приложений https://collab.cels.anl.gov/display/ESR/SZ
источник
Возможные методы, которые можно использовать для сжатия с плавающей точкой:
Транспонировать 4xN для чисел с плавающей запятой и 8xN для двойных + lz77
Реализация: Сжатие с плавающей запятой в TurboTranspose
см. Также сжатие с потерями с ограниченными ошибками
Предиктор (например, метод конечного контекста) + кодирование (например, "целочисленное сжатие").
Реализация: Сжатие с плавающей точкой в TurboPFor,
включая специальное сжатие для временных рядов.
когда возможно, преобразуйте все числа с плавающей точкой в целые числа (например, 1.63 -> 163), затем используйте целочисленное сжатие
Вы можете проверить все эти методы с вашими данными, используя инструмент icapp для Linux и Windows.
источник
Мы используем ZFP с HDF5 для наших медицинских изображений. Это сделано для сжатия с плавающей запятой.
Мы запускаем его буквально на всем, и у нас хранится более 40 ТБ данных (и они используются!). Это достаточно быстро для сохранения наших данных в режиме реального времени, и мы можем указать необходимую точность, поэтому, хотя формат с потерями, мы не видим каких-либо различий в наших конечных результатах.
источник
Возможно, формат, который вам требуется, должен хранить только смещения от значения к соседнему значению.
С другой стороны, возможно, вы могли бы использовать частотную область, возможно, даже сохранив эти значения в виде аудиофайла без потерь, например «flac lossless», так как вам требуются некоторые из тех же свойств для звука.
Тем не менее, я собираюсь использовать другой подход, пытаясь ответить на вопрос, который, я надеюсь, может помочь. Что вы говорите, так это то, что минимальная длина описания для представления этих данных меньше, чем предоставление всех точек данных.
https://en.wikipedia.org/wiki/Minimum_description_length
Эффективно программа, компьютерный код, является хорошим примером. И если вы не возражаете против того, что что-то, в первую очередь, выполняет данные, выполняемые при выполнении, и, следовательно, также является кодом, то вы можете сжать значения с плавающей запятой в нечто вроде функции или формулы.
Делать это особенно хорошо автоматически и в реалистичном количестве вычислений не сложно. Тем не менее, Wolfram Language предоставляет некоторые функциональные возможности, чтобы сделать это:
https://reference.wolfram.com/language/ref/FindSequenceFunction.html https://reference.wolfram.com/language/ref/FindGeneratingFunction.html https://reference.wolfram.com/language/ref/FindFormula. HTML
https://reference.wolfram.com/language/ref/RSolve.html
источник
Почему бы просто не сохранить float32 / float16? В клочья,
Это не сработает, если вы моделируете эффект Бабочки в теории хаоса, но они понятны, переносимы, «не требуют никакой работы с моей стороны». И сжатие 2: 1/4: 1 по сравнению с float64 трудно победить :)
Заметки:
"Тип массива float16 не поддерживается в np.linalg"; вам придется расширить его до 32 или 64 после прочтения.
Чтобы увидеть, как отличаются параметры с плавающей точкой,
Сюжет о тривиальном тестовом примере, сравнивающем float 64 32 и 16, см. Здесь .
источник