2017-01-04 2 views
0

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

Дополнительная информация: На самом деле существует гораздо больше термометров и, возможно, других датчиков, связанных с технологией. И есть хорошо известные временные интервалы, где кривая принадлежит партии, обработанной на машине. Температурные кривые должны быть добавлены в пакетную документацию.

Моя идея заключалась в том, что температура является гладкой функцией, которую можно каким-то образом интерполировать - скажем, что звук сжат с использованием формата MP3. Сжатие не должно быть бессодержательным. Тем не менее, должна быть возможность восстановить температурную кривую (не обязательно идентичные значения проб и идентичный интервал выборки), скажем, чтобы иметь возможность построить кривую или рассказать, какая температура была в определенное время.

Исходные значения образцов из таблицы SQL будут обработаны, сжатая версия будет храниться в другом месте (возможно, также в базе данных SQL, как blob), а затем необработанные образцы можно удалить, чтобы сохранить пространство базы данных.

Есть ли широко известный и широко используемый подход к проблеме?

+1

Большинство (все?) SQL-базы данных поддерживают прозрачное сжатие данных, в идеале даже столбчатое хранилище, что позволяет более эффективно использовать корреляции данных. Но сколько данных мы говорим здесь? Также для некоторых случаев использования вам не нужно хранить необработанные исторические данные, таких агрегатов, как среднее и процентилей, может быть достаточно для вашего варианта использования.И если исторические данные не должны быть легко доступны, вы можете просто выгрузить их в сжатый файл и загрузить, например, Amazon S3. – NikoNyrh

ответ

2

Простым подходом будет кодирование температуры в байтах или двух байтах в зависимости от требуемого диапазона и точности, а затем для записи первой температуры на ваш выход, за которой следует разница между температурами для всех остальных. Для двухбайтовых температур вы можете ограничить диапазон и записать один или два байта в зависимости от разницы с целым числом переменной длины. Например. если установлен старший бит первого байта, то следующий байт содержит еще 8 бит разницы, что позволяет использовать 15 бит разницы. В большинстве случаев это будет один байт, основанный на вашем описании.

Затем возьмите этот поток и подайте его на стандартный компрессор без потерь, например. Zlib.

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

Вычитание последовательных значений является простейшим предиктором. В этом случае предсказанием следующего значения является значение перед ним. Он также может быть наиболее эффективным, в зависимости от шума ваших данных. Если ваши данные действительно гладкие, тогда вы можете попробовать предиктор более высокого порядка, чтобы узнать, есть ли у вас более высокая производительность. Например. предсказатель для следующей точки, используя последние две точки, 2а - б, где является предыдущей точкой и б является точкой до этого, или с использованием последних три очка 3a - 3b + с, где c - это пункт до b. (Они предполагают равные промежутки времени между ними.)

+0

Это хорошая идея! Сигнал (float, ограниченный min, max interval) может быть квантован в целое. 64 K шагов между min и max приводят к довольно хорошей точности для многих промышленных сигналов, таких как температура, давление и т. Д. Тогда дельта-кодирование обеспечивает небольшие значения, если значение не изменяется слишком быстро или когда выборка требуется очень часто. Я думаю, что ключ будет выбирать подходящую функцию прогнозирования. Есть ли какая-то теория, как правильно ее выбрать? (Возможно, после анализа данных?) – pepr

+0

«So Long And Thanks for All ... zlib» :) – pepr

+1

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

Смежные вопросы