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

26

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

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

Требования:

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

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

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

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

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

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

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

Ответы:

22

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

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

meawoppl
источник
оу, это действительно круто (и ново для меня!)
Арон Ахмадиа
Ссылка не работает. Есть ли шанс, что вы знаете, где это сейчас?
Алексис Уилк
1
@AlexisWilke Я исправил ссылку. Это был первый результат поиска Google в Blosc.
Дуг Липински
1
Blosc может быть быстрым, но его степень сжатия в массивах с плавающей точкой является катастрофой. С лучшим сжатием, которое он предлагает, это дает около 98% исходного размера. Спасибо за совет в любом случае.
Сжатие в массивах с плавающей точкой сильно зависит от содержимого. Я подозреваю, что в битах, которые вы сжимаете, мало (структурированной) информации. Кроме того, blosc все еще находится в активной разработке через 5 лет!
Meawoppl
7

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

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

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

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

f3lix
источник
Спасибо за ответ! Я не использовал 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, так как более вероятно, что получатся более длинные последовательности с одинаковым значением. Смотрите здесь для некоторых ориентиров .

xioxox
источник
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.

powturbo
источник
1

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

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

LKlevin
источник
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

alan2here
источник
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, см. Здесь .

Денис
источник