Сжатие потока double
От: cppguard  
Дата: 27.05.22 04:10
Оценка: 5 (1)
Дан поток чисел типа double, в котором соседние элементы различаются мантиссой не более чем на байт. Или могут различаться больше, но очень редко. Примером такого потока могут быть данные котировок с биржи. И стоит задача — как можно лучше сжать такой поток. У меня появилась идея — в double храним только опорные элементы (первый и те, которые отличаются от соседних больше чем на байт), а всю остальную информацию записываем в виде разницы. Соответственно, восстановление заключается в последовательном прибавлении разницы к опорным элементам.

Вопрос: по каким ключевым словам можно найти больше информации? Перед неализацией хочу убедиться, что такой алгоритм не будет проигрыватьв gzip.
Re: Сжатие потока double
От: ArtDenis Россия  
Дата: 27.05.22 04:38
Оценка: 6 (1)
Здравствуйте, cppguard, Вы писали:

C>Дан поток чисел типа double, в котором соседние элементы различаются мантиссой не более чем на байт. Или могут различаться больше, но очень редко. Примером такого потока могут быть данные котировок с биржи. И стоит задача — как можно лучше сжать такой поток.


Сейчас есть простые алгоритмы, основанные на XOR-е бинарных представлений двух соседних значений и последующим сжатием результата. Гуглить по float sequence XOR compression. Есть более сложные алгоритмы на других принципах, в том числе с потерей точности. Для них нужно гуглить без слова XOR. Выбирай на вкус )
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Сжатие потока double
От: Mihas  
Дата: 27.05.22 07:18
Оценка: 5 (1)
Здравствуйте, cppguard, Вы писали:

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

Есть еще двухбайтовый флоат. Его точности может хватить для разницы с опорным элементом.
Re: Сжатие потока double
От: scf  
Дата: 27.05.22 12:06
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Дан поток чисел типа double, в котором соседние элементы различаются мантиссой не более чем на байт. Или могут различаться больше, но очень редко. Примером такого потока могут быть данные котировок с биржи. И стоит задача — как можно лучше сжать такой поток. У меня появилась идея — в double храним только опорные элементы (первый и те, которые отличаются от соседних больше чем на байт), а всю остальную информацию записываем в виде разницы. Соответственно, восстановление заключается в последовательном прибавлении разницы к опорным элементам.


Можно сжимать мантиссы и экспоненты раздельно. И, конечно, сжимать дельты.
Re: Сжатие потока double
От: fk0 Россия https://fk0.name
Дата: 27.05.22 13:32
Оценка: 2 (1)
Здравствуйте, cppguard, Вы писали:

C>Дан поток чисел типа double, в котором соседние элементы различаются мантиссой не более чем на байт. Или могут различаться больше, но очень редко. Примером такого потока могут быть данные котировок с биржи. И стоит задача — как можно лучше сжать такой поток. У меня появилась идея...


C>Вопрос: по каким ключевым словам можно найти больше информации? Перед неализацией хочу убедиться, что такой алгоритм не будет проигрыватьв gzip.


Честно говоря не знаю. Современный интернет -- помойка. Ищите и обращете. Например, compression.ru в разделе "статьи" и далее по ссылкам.

gzip и статистическое кодирование -- это разные подходы. Сравнивать в лоб бесмысленно.
Одно часто дополняет другое (внутри того же gzip, но там так кодируются не сами данные, а ссылки на повторяющиеся данные).
Есть смысл попробовать комбинацию обоих методов (но,конечно, не в виде готового gzip -- так не сработает).

Дельта-кодирование -- это лишь первый шаг. Нет смысла кодировать специальным образом только отдельные записи,
проще всегда хранить разности. Но сами разности, разной величины, встречаются с разной частотой. И их (разности)
тоже можно закодировать по-разному: MTF, код Голомба (Райса), арифметическое кодирование наконец (range coder им. Д. Субботина).
Идея в том, чтоб представить разность меньшим количеством битов, переменным и не обязательно целым вообще.

Дальше больше. Не обязательно кодировать разность между предыдущим и следующим элементом. В общем случае
можно кодировать разность между предсказанным и фактическим значением. Где значения пресказываются (экстраполируются)
на основе серии предыдущих значений (или даже серий разностей). В простейшем случае "предсказателем" может быть фильтр
низких частот (попросту среднее последних нескольких значений).

Это всё статистические методы. Все же виды LZ (читай ZIP) они про поиск последовательностей повторяющихся значений
(конкретно байтов, но не обязательно). Таких последовательностей в в биржевых данных, или в результах измерений,
может и не оказаться. Все виды LZ хорошо работают для сжатия текстов, например. Где есть повторяющиеся слова, фразы
или хотя бы слоги.

Для биржевых котировок или физических данных я бы больше думал, как описано выше, о разностном кодировании
между экстраполированнойи фактической величиной. Вопрос как сделать прогноз следующей величины с минимальной
ошибкой (эта часть работает и в кодере, и в декодере). Кстати примером такого алгоритма для записи звука является
ADPCM -- может имеет смысл взять на вооружение.
Re: Сжатие потока double
От: swame  
Дата: 28.05.22 16:19
Оценка: 6 (1)
Здравствуйте, cppguard, Вы писали:

C>Дан поток чисел типа double, в котором соседние элементы различаются мантиссой не более чем на байт. Или могут различаться больше, но очень редко. Примером такого потока могут быть данные котировок с биржи. И стоит задача — как можно лучше сжать такой поток. У меня появилась идея — в double храним только опорные элементы (первый и те, которые отличаются от соседних больше чем на байт), а всю остальную информацию записываем в виде разницы. Соответственно, восстановление заключается в последовательном прибавлении разницы к опорным элементам.


C>Вопрос: по каким ключевым словам можно найти больше информации? Перед неализацией хочу убедиться, что такой алгоритм не будет проигрыватьв gzip.


Какая задача?
Точно нужно ли сжатие без потерь или допускается с потерями?
Для всяких измерений можно посмотреть к примеру Swinging Door .
Re[2]: Сжатие потока double
От: cppguard  
Дата: 29.05.22 01:22
Оценка:
Здравствуйте, swame, Вы писали:

S>Какая задача?

S>Точно нужно ли сжатие без потерь или допускается с потерями?
S>Для всяких измерений можно посмотреть к примеру Swinging Door .

Задача — сжимать историю котировок криптовалют, 100байт/с * 300 валютных пар (и это число растёт), и всё это нужно хранить несколько лет и ещё передавать по сети. Так что с потерями нельзя, а алгоритм интересный, спасибо.
Re: Сжатие потока double
От: vsb Казахстан  
Дата: 29.05.22 07:45
Оценка:
https://rsdn.org/forum/alg/8187840.flat
Автор: vsb
Дата: 04.02.22
тут обсуждали подобную тему, может чего полезного найдёшь.
Re: Сжатие потока double
От: AtCrossroads  
Дата: 31.05.22 08:55
Оценка:
C>Дан поток чисел типа double, в котором соседние элементы различаются мантиссой не более чем на байт. Или могут различаться больше, но очень редко. Примером такого потока могут быть данные котировок с биржи.

Именно для данных биржы стоит рассмотреть использовать шаг цены и диапазон цены на сессию.
Re[2]: Сжатие потока double
От: cppguard  
Дата: 01.06.22 05:48
Оценка:
Здравствуйте, AtCrossroads, Вы писали:

AC>Именно для данных биржы стоит рассмотреть использовать шаг цены и диапазон цены на сессию.


Отдельно все слова понятны. В чём идея-то?
Re[3]: Сжатие потока double
От: AtCrossroads  
Дата: 01.06.22 09:02
Оценка:
AC>>Именно для данных биржы стоит рассмотреть использовать шаг цены и диапазон цены на сессию.

C>Отдельно все слова понятны. В чём идея-то?


Ну, типа, хранить целое кол-во шагов цены
1. от минимальной/максимальной на сессию;
2. от предыдущего тика или чего-то.
Re[4]: Сжатие потока double
От: cppguard  
Дата: 01.06.22 09:41
Оценка:
Здравствуйте, AtCrossroads, Вы писали:

AC>Ну, типа, хранить целое кол-во шагов цены

AC>1. от минимальной/максимальной на сессию;
AC>2. от предыдущего тика или чего-то.

Идея интересная, но её тяжело обобщить. Допустим, храним мы TSLA, и тут сплит произошёл. Или биток упал, у шаг цены изменился с 1e-10 на 1e-11. Вобщем, работать может и будет, но для отдельно взятого тикера, а мне нужен универсальный алгоритм.
Re: Сжатие потока double
От: JacobR  
Дата: 03.10.22 11:18
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Дан поток чисел типа double, в котором соседние элементы различаются мантиссой не более чем на байт. Или могут различаться больше, но очень редко. Примером такого потока могут быть данные котировок с биржи. И стоит задача — как можно лучше сжать такой поток. У меня появилась идея — в double храним только опорные элементы (первый и те, которые отличаются от соседних больше чем на байт), а всю остальную информацию записываем в виде разницы. Соответственно, восстановление заключается в последовательном прибавлении разницы к опорным элементам.


C>Вопрос: по каким ключевым словам можно найти больше информации? Перед неализацией хочу убедиться, что такой алгоритм не будет проигрыватьв gzip.


Решал похожую задачу, но для координат, самый эффективней способ оказался найти минимальный шаг, метр, миллиметр, нанометр и т.д, что бы можно было посадить на целочисленную сетку, а дальше уже богатый выбор различных алгоритмов разностного кодирования.
В случае, когда не было возможности выбрать сетку то решали через нахождение целочисленной дроби для числа double, условно говоря 1.333333333 это 4/3

https://en.wikipedia.org/wiki/Continued_fraction
https://en.wikipedia.org/wiki/Stern%E2%80%93Brocot_tree
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.