В этом разделе вы можете проголосовать за идеи по открытым проектам. Вы всегда можете предложить свою идею, перейдя на страницу проекта.
<<< Назадhttps://github.com/sergejey/majordomo/issues/1105
Есть необходимость в свойствах которые не пишутся в базу данных, а только временно содержатся в памяти.
Аналог transient в языках программирования - чтобы свойство хранилось только в памяти и могло быть утеряно при перезапуске.
Use case:
имеется источник данных, который генерирует большое количество данных в единицу времени. В моём случае это mqtt обновления приходящие каждую секунду с более чем двумя десятками входных значений (go-e charger + controller). Если я регистрирую все параметры и привязываю к свойствам моего объекта(-ов), получаю большое количество обращений к БД. Ситуация усугубляется если есть необходимость хранить историю. Т.к. для истории достаточно хранить показания беря усредненные значения за последнюю минуту, то решением "в лоб" было по ежеминутному таймеру брать getHistoryAvg(-1 minute) и писать результат в другое свойство с более длинной историей. Это уменьшило количество данных в базе, но увеличило количество обращений к базе (ежесекундная запись, после ежеминутный рассчет среднего по последним шестидесяти значениям). В итоге убрав все лишнее, и оставив только самое необходимые свойства, имею >300 запросов к БД.
В качестве обходного решения, я завёл отдельные свойства без истории (назвал xxxBuffer), но пишу в них массив данных - при поступлении нового значения в исходное свойство, вызывается метод, который добавляет в конец xxxBuffer'а новое значение. А по таймеру, раз в минуту высчитывается среднее значение из массива xxxBuffer, и результат записывается в xxx свойство (которое уже с историей в базе). После чего xxxBuffer очищается. Скорость работы значительно возросла, однако по-прежнему каждую секунду происходит обновление: