оптимизация истории значений переменных
Добавлено: Вт апр 16, 2013 4:08 pm
При интенсивном использовании датчиков, сохраняющих историю значений в базе данных, со временем разрастается таблица phistory -- именно там хранятся все промежуточные значения. я решил попробовать заняться оптимизацией этих данных и написал скрипт, который хочу вам представить.
Этот скрипт делает две вещи. Во-первых, выводит информацию о том, сколько данных хранится в таблице и по каким переменным и, во-вторых, оптимизирует (объединяет) устаревающие данные по определённому алгоритму.
Предупреждение: перед началом экспериментов с этим скриптом, сохраните резервную копию таблицы phistory, на всякий случай.
Скрипт нужно распаковать из архива и положить в папку /htdocs/scripts/ и вызывать http://адрес_сервера/scripts/optimize_history.php
Для работы скрипта надо в коде раскоментировать массив $rules, где задаются параметры оптимизации свойств класса
Вот пример моего массива:
Таким образом, задаётся класс.свойство (либо только свойство), количество дней хранения (в принципе, это лучше задавать при настройке свойства класса), а так же способ оптимизации (avg/max/sum -- по среднему, по максимальному, по сумме). Оптимизация заключается в том, что система выбирает набор значений за период из истории и заменяет его одним по указанному способу. На данный момент, по коду скрипта заданы жёсткие условия оптимизации, так что для того чтобы их изменить, надо внести соответствующие изменения в код.
Сейчас используется следующаяя "этапность" оптимизации:
1. Данные старше 1 месяца оптимизируются по двух-часовым отрезкам (если за каждые два часа в базе больше чем одно значение, то они все заменяются одним по указанному алгоритму оптимизации -- среднему за период, максимальному, либо сумме значений)
2. Данные старше 1 недели (но младше месяца) оптимизируются по часовым отрезкам.
3. Старше суток (но младше недели) оптимизируются по 20-минутным отрезкам
4. Старше часа (но младше суток) по 3-х минутным отрезкам
5. Младше часа не оптимизируются
В общем, я смог сократить таблицу phistory с 250 000 значений до 60 000, что, теоретически, ускоряет работу системы в целом (особенно построение графиков).
Скрипт этот не готовый рецепт и его лучше использововать как основу для собственных экспериментов, но, в принципе, можно и использовать как есть, подставляя только желаемые классы/свойства в блок правил. А можно вообще ничего не править и запустить, чтобы посмотреть статистику использование phistory.
Этот скрипт делает две вещи. Во-первых, выводит информацию о том, сколько данных хранится в таблице и по каким переменным и, во-вторых, оптимизирует (объединяет) устаревающие данные по определённому алгоритму.
Предупреждение: перед началом экспериментов с этим скриптом, сохраните резервную копию таблицы phistory, на всякий случай.
Скрипт нужно распаковать из архива и положить в папку /htdocs/scripts/ и вызывать http://адрес_сервера/scripts/optimize_history.php
Для работы скрипта надо в коде раскоментировать массив $rules, где задаются параметры оптимизации свойств класса
Вот пример моего массива:
Код: Выделить всё
$rules=array(
'tempSensors.temp'=>array('optimize'=>'avg'), // оптимизировать значения свойства temp всех объектов класса tempSensors по среднему значению
'uptime'=>array('keep'=>30, 'optimize'=>'max'), // удалять данные свойства uptime (любого класса), старше 30 дней и оптимизировать остальные по максимальнму значению
'Relays.status'=>array('keep'=>0), // удалять все данные Relays.status, попавшие в историю
'WeatherStations.tempOutside'=>array('optimize'=>'avg') // оптимизировать все данные WeatherStations.tempOutside по среднему значению
);
Сейчас используется следующаяя "этапность" оптимизации:
1. Данные старше 1 месяца оптимизируются по двух-часовым отрезкам (если за каждые два часа в базе больше чем одно значение, то они все заменяются одним по указанному алгоритму оптимизации -- среднему за период, максимальному, либо сумме значений)
2. Данные старше 1 недели (но младше месяца) оптимизируются по часовым отрезкам.
3. Старше суток (но младше недели) оптимизируются по 20-минутным отрезкам
4. Старше часа (но младше суток) по 3-х минутным отрезкам
5. Младше часа не оптимизируются
В общем, я смог сократить таблицу phistory с 250 000 значений до 60 000, что, теоретически, ускоряет работу системы в целом (особенно построение графиков).
Скрипт этот не готовый рецепт и его лучше использововать как основу для собственных экспериментов, но, в принципе, можно и использовать как есть, подставляя только желаемые классы/свойства в блок правил. А можно вообще ничего не править и запустить, чтобы посмотреть статистику использование phistory.