оптимизация истории значений переменных

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

оптимизация истории значений переменных

Сообщение sergejey » Вт апр 16, 2013 4:08 pm

При интенсивном использовании датчиков, сохраняющих историю значений в базе данных, со временем разрастается таблица 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 по среднему значению
 );
Таким образом, задаётся класс.свойство (либо только свойство), количество дней хранения (в принципе, это лучше задавать при настройке свойства класса), а так же способ оптимизации (avg/max/sum -- по среднему, по максимальному, по сумме). Оптимизация заключается в том, что система выбирает набор значений за период из истории и заменяет его одним по указанному способу. На данный момент, по коду скрипта заданы жёсткие условия оптимизации, так что для того чтобы их изменить, надо внести соответствующие изменения в код.

Сейчас используется следующаяя "этапность" оптимизации:
1. Данные старше 1 месяца оптимизируются по двух-часовым отрезкам (если за каждые два часа в базе больше чем одно значение, то они все заменяются одним по указанному алгоритму оптимизации -- среднему за период, максимальному, либо сумме значений)
2. Данные старше 1 недели (но младше месяца) оптимизируются по часовым отрезкам.
3. Старше суток (но младше недели) оптимизируются по 20-минутным отрезкам
4. Старше часа (но младше суток) по 3-х минутным отрезкам
5. Младше часа не оптимизируются

В общем, я смог сократить таблицу phistory с 250 000 значений до 60 000, что, теоретически, ускоряет работу системы в целом (особенно построение графиков).

Скрипт этот не готовый рецепт и его лучше использововать как основу для собственных экспериментов, но, в принципе, можно и использовать как есть, подставляя только желаемые классы/свойства в блок правил. А можно вообще ничего не править и запустить, чтобы посмотреть статистику использование phistory.
Вложения
optimize_history.zip
(2.22 КБ) 439 скачиваний
За это сообщение автора sergejey поблагодарили (всего 4):
Amarok (Пт дек 19, 2014 8:31 am) • zelevova (Вт май 19, 2015 2:33 pm) • ABola (Чт янв 21, 2016 10:36 am) • Otto (Вт апр 11, 2017 3:07 pm)
Рейтинг: 4.65%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: оптимизация истории значений переменных

Сообщение Alex » Вт апр 16, 2013 4:35 pm

Просто отлично. То, что нужно.
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: оптимизация истории значений переменных

Сообщение Urbas81 » Вт апр 23, 2013 12:34 pm

Подскажите, где настраивается время хранения значений температур, система крутится почти месяц, а рельно графики строятся с 16 апреля, посмотрел в базе тоже только с этой даты данные, а куда делись предыдущие, сам никаких скриптов оптимизации не скачивал и не запускал.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: оптимизация истории значений переменных

Сообщение sergejey » Вт апр 23, 2013 1:19 pm

Urbas81 писал(а):Подскажите, где настраивается время хранения значений температур, система крутится почти месяц, а рельно графики строятся с 16 апреля, посмотрел в базе тоже только с этой даты данные, а куда делись предыдущие, сам никаких скриптов оптимизации не скачивал и не запускал.
Надо смотреть родительский для объектов класс, в нём вкладку свойства и далее редактировать соответствующее свойство и там есть параметр "Хранить историю (дней)"

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: оптимизация истории значений переменных

Сообщение Urbas81 » Вт апр 23, 2013 2:04 pm

Спасибо, нашел, стояло 7 дней, интересно, можно восстановить предыдущие данные, если остались резервные sql по некоторым дням, когда происходил перезапуск системы.
DiArt
Сообщения: 210
Зарегистрирован: Пт апр 12, 2013 2:27 pm
Откуда: Уфа
Благодарил (а): 28 раз
Поблагодарили: 16 раз

Re: оптимизация истории значений переменных

Сообщение DiArt » Пт янв 24, 2014 2:28 pm

Хочу оптимизировать таблицу с новостями (набралось около ста тысяч записей). Хочу чтобы более 2-х недель новости удалялись.
Таблица rss_items
Столбцы ID, Title, Body, URL и т.д.
В Majordomo Объект ThisNews
ThisNews.NewsHead - имя новости вытаскивается с базы со столбца Title
ThisNews.NewsBody - Тело новости вытаскивается с базы со столбца Body
Как лучше сделать оптимизацию? В таблице или в объекте?
Если сделать так:

Код: Выделить всё

$rules=array(
'ThisNews'=>array('keep'=>15)
);
Он удалит все строки объекта ThisNews старше 15 дней, т.е. теоретически уменьшит таблицу со ста тысяч например до 2 тысяч. Я прав?
Система на Неттоп 3Q Nettop Qoo!
(Intel Celeron J1800, 2x2410 МГц, 4096 Мб, HDD 1000 Гб, HDMI, VGA , Wi-Fi, Ethernet, Ubuntu 14.04.2)
Вторая система на Raspberry Pi 3.
D-Link DCS-930L/Broadlink RM2-Pro/BroadLink SP3 CC/Ginzzu HS-K07W
Я в CONNECT
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: оптимизация истории значений переменных

Сообщение sergejey » Пт янв 24, 2014 2:59 pm

Запись 'ThisNews.NewsHeadr'=>array('keep'=>15) позволит удалять из истории объекта записи старше 15 дней, но на rss_items оно не влияет.

А для чего хранить историю этого объекта в принципе? Пусть себе лежат новости в rss_items.
Последнюю таблицу можно так чистить:
SQLExec("DELETE FROM rss_items WHERE TO_DAYS(NOW())-TO_DAYS(ADDED)>15");

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
DiArt
Сообщения: 210
Зарегистрирован: Пт апр 12, 2013 2:27 pm
Откуда: Уфа
Благодарил (а): 28 раз
Поблагодарили: 16 раз

Re: оптимизация истории значений переменных

Сообщение DiArt » Пт янв 24, 2014 3:05 pm

Просто мне кажется из -за такого большого объёма растёт и сама база. Хотел уменьшить. Вот спасибо за код по очистки базы.
Система на Неттоп 3Q Nettop Qoo!
(Intel Celeron J1800, 2x2410 МГц, 4096 Мб, HDD 1000 Гб, HDMI, VGA , Wi-Fi, Ethernet, Ubuntu 14.04.2)
Вторая система на Raspberry Pi 3.
D-Link DCS-930L/Broadlink RM2-Pro/BroadLink SP3 CC/Ginzzu HS-K07W
Я в CONNECT
NightRider
Сообщения: 70
Зарегистрирован: Пт авг 21, 2015 2:27 pm
Благодарил (а): 8 раз
Поблагодарили: 4 раза

Re: оптимизация истории значений переменных

Сообщение NightRider » Ср янв 20, 2016 6:17 pm

Запустил скриптик, оптимизировал историю почти с 500 тысяч до 110, супер!

Единственно заметил странность в выводимых сообщениях:
Before last WEEK
Value ID: 176
Interval from 2015-12-21 17:57:57 to 2016-01-13 17:57:58 (every 3600 seconds)
Total values: 1650
Optimizing (should be about 552 records)... . . . . . . . . . . . . . . . . . . . Done (removed: 1686)
smoker_vvo
Сообщения: 113
Зарегистрирован: Пт дек 14, 2012 3:46 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Re: оптимизация истории значений переменных

Сообщение smoker_vvo » Пт янв 22, 2016 10:12 am

Все бы хорошо...... но заканчивается сообщением что время истекло.... записей более 1000000......
Calculating stats:
systemStates.stateColor (object: Astra): 26109
systemStates.stateColor (object: System): 18
systemStates.stateColor (object: Security): 8
systemStates.stateColor (object: Septic): 294
systemStates.stateColor (object: Communication): 32
tempSensors.temp (object: sensorT4): 40324
tempSensors.direction (object: sensorT4): 41954
tempSensors.updated (object: sensorT4): 42804
tempSensors.updatedTime (object: sensorT4): 42803
tempSensors.temp (object: sensorT0): 10647
tempSensors.direction (object: sensorT0): 42255
tempSensors.updated (object: sensorT0): 44282
tempSensors.updatedTime (object: sensorT0): 44282
tempSensors.temp (object: sensorT1): 2174
tempSensors.direction (object: sensorT1): 43447
tempSensors.updated (object: sensorT1): 43668
tempSensors.updatedTime (object: sensorT1): 43661
tempSensors.temp (object: sensorT2): 1796
tempSensors.direction (object: sensorT2): 32408
tempSensors.updated (object: sensorT2): 32414
tempSensors.updatedTime (object: sensorT2): 32408
tempSensors.temp (object: sensorT3): 6611
tempSensors.direction (object: sensorT3): 47844
tempSensors.updated (object: sensorT3): 48132
tempSensors.updatedTime (object: sensorT3): 48129
tempSensors.temp (object: sensorT5): 6736
tempSensors.direction (object: sensorT5): 39601
tempSensors.updated (object: sensorT5): 40752
tempSensors.updatedTime (object: sensorT5): 40751
tempSensors.temp (object: sensorT6): 1898
tempSensors.direction (object: sensorT6): 41206
tempSensors.updated (object: sensorT6): 42476
tempSensors.updatedTime (object: sensorT6): 42476
tempSensors.temp (object: sensorT7): 48836
tempSensors.direction (object: sensorT7): 48938
tempSensors.updated (object: sensorT7): 51222
tempSensors.updatedTime (object: sensorT7): 51219
keySensor.status (object: sensorSeptic): 2
systemStates.stateColor (object: ALM): 21
keySensor.status (object: sensorPereliv): 3

Grand-total: 1244501

И тут возник вопрос... а можно как то конкретные записи чистить?? КАК?
Ответить