Сжатие данных с плавающей запятой


26

Существуют ли какие-либо инструменты, специально предназначенные для сжатия научных данных с плавающей запятой?

Если функция гладкая, очевидно, что числа, представляющие эту функцию, сильно коррелируют, поэтому данные должны хорошо сжиматься. Однако сжатие двоичных данных с плавающей запятой не сжимает их так хорошо. Мне интересно, есть ли метод, специально разработанный для сжатия данных с плавающей запятой.

Требования:

  • Сжатие без потерь или возможность указать минимальное количество сохраняемых цифр (для некоторых приложений doubleможет быть больше, чем нам нужно, но floatможет не хватать точности).

  • Хорошо проверенный рабочий инструмент (т.е. не просто статья, описывающая теоретический метод).

  • Подходит для сжатия 1D числовых данных (таких как временной ряд)

  • Кроссплатформенность (должна работать на Windows)

  • Это должно быть быстро - желательно не намного медленнее, чем gzip. Я обнаружил, что, если у меня есть числа, сохраненные как ASCII, сжатие файла может ускорить чтение и обработку его (поскольку операция может быть связана с вводом / выводом).

Я особенно хотел бы услышать от людей, которые фактически использовали такой инструмент.


Это было отчасти вдохновлено существованием FLAC , что говорит о том, что специализированный метод должен работать (намного?) Лучше, чем gzip.
— Сабольч

Я смотрю на это сейчас.
— Сабольч

Ухоженная. Я собираюсь дать этому водоворот.
— meawoppl

Ответы:


22

Попробуйте Blosc . Во многих случаях это быстрее, чем memcopy . Подумайте об этом на секунду. , , злой.

Это супер стабильный, высоко проверенный, кроссплатформенный, и работает как чемпион.


оу, это действительно круто (и ново для меня!)
— Арон Ахмадиа

Ссылка не работает. Есть ли шанс, что вы знаете, где это сейчас?
— Алексис Уилк

1
@AlexisWilke Я исправил ссылку. Это был первый результат поиска Google в Blosc.
— Дуг Липински

1
Blosc может быть быстрым, но его степень сжатия в массивах с плавающей точкой является катастрофой. С лучшим сжатием, которое он предлагает, это дает около 98% исходного размера. Спасибо за совет в любом случае.

Сжатие в массивах с плавающей точкой сильно зависит от содержимого. Я подозреваю, что в битах, которые вы сжимаете, мало (структурированной) информации. Кроме того, blosc все еще находится в активной разработке через 5 лет!
— Meawoppl

7

Я получил хорошие результаты, используя HDF5 и его фильтр GZIP.

HDF5 также предоставляет фильтр SZIP, который обеспечивает лучшие результаты для некоторых научных наборов данных.

По моему опыту, выбор компрессий сильно зависит от вида данных, и сравнительный анализ, вероятно, является единственным способом сделать правильный выбор.

Кстати, сторонние фильтры для HDF5 включают BLOSC, BZIP2, LZO, LZF, MAFISC.


Спасибо за ответ! Я не использовал HDF5 много. Правильно ли, что использование фильтра gzip с форматом HDF5 даст мне ту же степень сжатия, что и при записи всего числа в плоский двоичный файл и запуске его через gzip? (Не обращайте внимания на возможное удобство / неудобство использования HDF5 на данный момент.) Что касается SZIP, оптимизирован ли он для наборов данных с плавающей запятой? (Мне любопытно, и это не ясно из просмотра страницы, на которую вы ссылаетесь.) На странице сказано, что основным преимуществом SZIP является скорость. GZIP также довольно быстр (обычно распаковка gzip для меня незначительна).
— Сабольч

Плоский двоичный файл в формате gzip, вероятно, будет меньше, чем файл HDF5 с фильтром gzip, поскольку HDF5 - это больше, чем необработанные данные. Иногда предварительная обработка с использованием фильтра случайного порядка может улучшить результаты gzip. Но вы правы, преимущества на самом деле скорее удобство. С HDF5 я легко заменяю фильтр сжатия (опробуйте разные настройки), а HDF5 обеспечивает функцию доступа к подмножествам ваших данных (интервалы во временных рядах).
— f3lix

1
Если вы идете по этому маршруту, проверьте pyTables . Это делает выше всего пару строк кода. Поддерживается (ранее, по крайней мере) автором Blosc.
— meawoppl

6

[-1,1]

В зависимости от лежащей в основе функции вы сможете безошибочно согласовать данные с функциональной формой, требуя меньше коэффициентов для описания функциональной формы, чем у вас есть точка данных (что приводит к сжатию). Результаты ошибок существуют для некоторых из этих методов, хотя я не знаю, даст ли какой-либо из них априорные (или апостериорные ) оценки или оценки ошибки.

Вы также можете взглянуть на методы, разработанные специально для сжатия чисел с плавающей запятой, такие как FPC и связанные алгоритмы. Смотрите статьи здесь , здесь , здесь , здесь и здесь , вместе с веб-страницей, содержащей старый исходный код здесь .


На самом деле я заинтересован в готовых инструментах, подобных gzip, которые не требуют никакой работы с моей стороны, особенно в том, что касается разработки и настройки моего собственного метода. Кроме того, было бы полезно иметь метод, который не требует считывания всего содержимого в память перед его распаковкой, поскольку у меня могут быть очень большие файлы данных, которые можно обрабатывать последовательно (это работает с gzip, но не при использовании Fourier преобразовать, если я сам не нарежу данные на куски, что усложнит все это еще больше) То, что предполагает, что мой файл данных представляет собой просто серию двоичных двойников, было бы превосходным.
— Сабольч

Также это преобразования 1: 1, а не методы сжатия. Они могут использоваться для создания данных, с которыми наивный алгоритм сжатия может работать лучше, но автономно не является решением.
— meawoppl

Некоторые из этих методов образуют математическую основу для алгоритмов сжатия, используемых при обработке сигналов, что и послужило идеей ответа. Эти преобразования обычно не 1: 1, за исключением особых обстоятельств.
— Джефф Оксберри

3

HDF5 может использовать алгоритм «тасования», в котором байты для N чисел с плавающей запятой переставляются так, что сначала идут первые байты из N чисел, затем 2-й и т. Д. Это дает лучшие коэффициенты сжатия после применения gzip, так как более вероятно, что получатся более длинные последовательности с одинаковым значением. Смотрите здесь для некоторых ориентиров .


1

SZ (разработанный Argonne в 2016 году) может быть хорошим выбором.

SZ: быстрый ограниченный ошибками компрессор с плавающей точкой для научных приложений https://collab.cels.anl.gov/display/ESR/SZ


Как вы думаете, почему это может быть хорошим выбором? Каковы его возможности по сравнению с другими методами сжатия?
— Павел

1

Возможные методы, которые можно использовать для сжатия с плавающей точкой:

  • Транспонировать 4xN для чисел с плавающей запятой и 8xN для двойных + lz77
    Реализация: Сжатие с плавающей запятой в TurboTranspose
    см. Также сжатие с потерями с ограниченными ошибками

  • Предиктор (например, метод конечного контекста) + кодирование (например, "целочисленное сжатие").
    Реализация: Сжатие с плавающей точкой в ​​TurboPFor,
    включая специальное сжатие для временных рядов.

  • когда возможно, преобразуйте все числа с плавающей точкой в ​​целые числа (например, 1.63 -> 163), затем используйте целочисленное сжатие

  • Вы можете проверить все эти методы с вашими данными, используя инструмент icapp для Linux и Windows.


1

Мы используем ZFP с HDF5 для наших медицинских изображений. Это сделано для сжатия с плавающей запятой.

Мы запускаем его буквально на всем, и у нас хранится более 40 ТБ данных (и они используются!). Это достаточно быстро для сохранения наших данных в режиме реального времени, и мы можем указать необходимую точность, поэтому, хотя формат с потерями, мы не видим каких-либо различий в наших конечных результатах.


0

Если функция гладкая, очевидно, что числа, представляющие эту функцию, сильно коррелируют, поэтому данные должны хорошо сжиматься.

Возможно, формат, который вам требуется, должен хранить только смещения от значения к соседнему значению.

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


0

Почему бы просто не сохранить float32 / float16? В клочья,

A.astype( np.float32 )  # 100M: 200 msec imac
A.astype( np.float16 )  # 100M: 700 msec

Это не сработает, если вы моделируете эффект Бабочки в теории хаоса, но они понятны, переносимы, «не требуют никакой работы с моей стороны». И сжатие 2: 1/4: 1 по сравнению с float64 трудно победить :)

Заметки:

"Тип массива float16 не поддерживается в np.linalg"; вам придется расширить его до 32 или 64 после прочтения.

Чтобы увидеть, как отличаются параметры с плавающей точкой,

import numpy as np
for f in [np.float64, np.float32, np.float16]:
    print np.finfo(f)

Сюжет о тривиальном тестовом примере, сравнивающем float 64 32 и 16, см. Здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.