Эффективность алгоритма
Модератор: immortal
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Эффективность алгоритма
Alex, расскажи пожалуйста чуть подробнее про параметры
$period_refresh
&prec=1
я бы хотел от них по возможности избавиться -- может быть можно по истории данных вычислять их, а не задавать пользователю?
в старой версии есть тоже такой параметр как px (минимальное количество пискелей через которые отбражается новое значение на графике), который тоже не очень интуитивно понятный, но он не обязательный и можно обходиться дефолтным значением, если не нужно особо оптимизировать.
$period_refresh
&prec=1
я бы хотел от них по возможности избавиться -- может быть можно по истории данных вычислять их, а не задавать пользователю?
в старой версии есть тоже такой параметр как px (минимальное количество пискелей через которые отбражается новое значение на графике), который тоже не очень интуитивно понятный, но он не обязательный и можно обходиться дефолтным значением, если не нужно особо оптимизировать.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Эффективность алгоритма
Я тоже.Alex, расскажи пожалуйста чуть подробнее про параметры
$period_refresh
&prec=1
я бы хотел от них по возможности избавиться
С $period_refresh всё просто. Поскольку мы имеем массив отсортированных, но не отмасштабированных по времени точек, то они равномерно заполняют всю ось времени, А $period_refresh вставляет «предыдущее» значение, если за период $period_refresh не пришло нового сигнала (датчик в реальности не работал). Т. е. «растягивает» ось времени на моменты, когда сигналов не было.
Можно, наверное, сделать как во второй части — сначала «растянуть» ось времени на ширину $wid, а потом понавтыкать точек пропорционально реальному времени.
С &prec=1 сложнее. Это отдельный алгоритм, несовместимый с первой частью. У меня есть подозрение, что совместить обе части можно на основе именно второй. Тогда и &prec=1 не понадобится.
Если не нужно ничего отображать кроме температуры можно вообще отказаться от второй части. Многие даже не заметят.
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Эффективность алгоритма
Потестировал несколько дней новый алгоритм. Как ни странно, но всё работает нормально.
Приделал второй канал. Никаких проблем. Всё работает. Загрузка минимальная. Без труда можно сделать 3-4-5-6-7 каналов и всё будет тянуть.
Почищу код и попозже выложу.
Приделал второй канал. Никаких проблем. Всё работает. Загрузка минимальная. Без труда можно сделать 3-4-5-6-7 каналов и всё будет тянуть.
Почищу код и попозже выложу.
- Вложения
-
- duo
- duo.png (10.56 КБ) 7844 просмотра
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Эффективность алгоритма
Отлично!
У самого пока времени заняться этим нет, так что с радостью поставлю финальный код в проект
У самого пока времени заняться этим нет, так что с радостью поставлю финальный код в проект
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Эффективность алгоритма
Я тут ещё одну версию алгоритма набросал... Может у кого будет возможность проверить
На моих графиках вроде показывает адекватные значения. Графики получаются без обрывов -- если данных не поступало, то будет прямая линия, соответствующая последнему известному значению. По идее работает одинаково для любых типов данных.
На моих графиках вроде показывает адекватные значения. Графики получаются без обрывов -- если данных не поступало, то будет прямая линия, соответствующая последнему известному значению. По идее работает одинаково для любых типов данных.
Код: Выделить всё
$history=SQLSelect("SELECT ID, VALUE, UNIX_TIMESTAMP(ADDED) as UNX FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>=('".date('Y-m-d H:i:s', $start_time)."') AND ADDED<=('".date('Y-m-d H:i:s', $end_time)."') ORDER BY ADDED");
$value=$history[0]['VALUE'];
$next_index=1;
$total_values=count($history);
while($start_time<$end_time) {
if ($next_index<$total_values) {
for($i=$next_index;$i<$total_values;$i++) {
$next_index=$i;
if ($history[$i]['UNX']>=$start_time) {
$value=$history[$i]['VALUE'];
break;
}
}
}
$values[]=$value;
if ($px_passed>30) {
if (date('Y-m-d', $start_time)!=$dt) {
$hours[]=date('d/m', $start_time);
$dt=date('Y-m-d', $start_time);
} else {
$hours[]=date('H:i', $start_time);
}
$px_passed=0;
} else {
$hours[]='';
}
$start_time+=$period;
$px+=$px_per_point;
$px_passed+=$px_per_point;
}
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Эффективность алгоритма
Протестировал. Площадки нормальные, графики правильные. Это хорошо.
Выявленные проблемы. Непериодические сигналы отображаются по другому и иногда теряются. Т. е. сигнал был, а на графике его нет. Почему так пока не копал.
Почему то с новым алгоритмом перестали показываться графики на одной из страниц. Хотя должны бы. Может быть дело в параметрах вызова, пока не разобрался.
Выявленные проблемы. Непериодические сигналы отображаются по другому и иногда теряются. Т. е. сигнал был, а на графике его нет. Почему так пока не копал.
Почему то с новым алгоритмом перестали показываться графики на одной из страниц. Хотя должны бы. Может быть дело в параметрах вызова, пока не разобрался.
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Эффективность алгоритма
Код сырой и вам придётся разбираться почему что не работает. Это задача для программиста. Если это не пугает, то могу выложить.@Alex
Выложи код для построения нескольких графиков на одной картинке
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Эффективность алгоритма
Догадываюсь, почему могут пропускаться разовые сигналы -- алгоритм разбивает время на мелкие дискретные участки, соответствующие разрешению графика, и берёт последнее значение из базы на этом участке (либо первое, точно не помню). Вполне возможно, что на одном участке совсем рядом есть два значения -- скажем сначало 1, потом 0 и из-за этой особенности, итоговое значение на участке будет одно из них. Как вариант, оставлять максимальное зачение на участке (если их несколько).Alex писал(а):Протестировал. Площадки нормальные, графики правильные. Это хорошо.
Выявленные проблемы. Непериодические сигналы отображаются по другому и иногда теряются. Т. е. сигнал был, а на графике его нет. Почему так пока не копал.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Эффективность алгоритма
А это нас не устраивает. Если это окажется 0, то мы пропустим сигнал.Вполне возможно, что на одном участке совсем рядом есть два значения -- скажем сначала 1, потом 0 и из-за этой особенности, итоговое значение на участке будет одно из них.
Не лучше ли сначала растянуть массив на ширину графика, а потом втыкать ненулевые (значимые) отсчёты пропорционально времени. Гарантированно на график попадут _все_ значения. Потерять в этом случае ничего не получится, даже если очень захотеть.
И вообще...
Наверное не надо делать универсальный модуль графики. Нужно под каждую задачу делать отдельный модуль. Например.
index.php - “аналоговые” графики
s.php – индикаторы
sign.php – сигнальный (PIR...) модуль
stat.php – модуль статистики
и т.д...