powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
25 сообщений из 29, страница 1 из 2
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032450
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем:
Есть 403 датчика (событий, реакций). В зависимости от сработавшего датчика нужно выполнить тот или иной код в Кэш.
Ежесекундно совершается от 5 до 70 событий. Все делается в режиме реального времени.
Количество датчиков планируется увеличить до 1500.
Получаем, что даже при 400 у нас в пиковые моменты кэш "спустую" может прогонять (пока дойдет до последней строки в коде КЭШ) 400*70=28000 строк.

Сейчас делается так.
Если датчик такой то, то делаем (исполняемый код) такой то.
Оптимизация только в том, что наиболее частые соыбтия расположены вверху

То есть сейчас код нечто вроде
Если "А" выполняем то то код Кэш "..."
Если "В" выполняем то то код Кэш "...2.."
и так до "403"

мне кажется, что это не совсем оптимально. Какие могут быть варианты еще для оптимизации?

Код можно не предлагать (не выкладывать), ГЛАВНОЕ ИДЕЯ (код напишем сами).
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032482
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант "разделить" запись "события" от датчика от "обработки" этих, уже записаных, событий...

Например завести табличку приоритетов и при записи события писать его вместе с его приоритетом... Это т.с. один акт.
Акт второй. Читать записаные события с учетом приоритета, запуск нужного кода и удаление события из списка.

Как вариант еще иметь несколько процессов по обработке таблички событий, возможно это сделает приоритет более т.с. "активным"...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032612
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем список датчиков и соответствующий им код:
Код: plaintext
1.
2.
3.
4.
^Sensor("A")="^routine1"
^Sensor("B")="sub^routine2(67)"
...
^Sensor("AAB")="##class(Sensor).Test()"

Далее вызываем код в зависимости от сработавшего датчика:
Код: plaintext
1.
2.
set sensor="G"
Do @($G(^Sensor(sensor),"^routineERROR"))
Ещё можно обработку разнести по разным экземплярам Caché с помощью ECP и отображения программ/пакетов.
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032614
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы делал так.

Заводим глобаль двухуровневую

^Code(Датчик,Событие)=Код

и делаем

if $data(^Code(Датчик,Событие)) xecute ^Code(Датчик,Событие)

Можно выполнять вместо xecute job или писать отдельную очередь

^очередь($i(^очередь))=^Code(Датчик,Событие)

и отдельным уже процессом обходить эту очередь, чтобы не тормозить процесс
который читает датчики.

Как то так.

=Сергей Шутов (logist)
ООО Димас, Хабаровск

fotopravka.ru пишет:
> Автор: "fotopravka.ru"
> Имеем:
> Есть 403 датчика (событий, реакций). В зависимости от сработавшего
> датчика нужно выполнить тот или иной код в Кэш.
> Ежесекундно совершается от 5 до 70 событий. Все делается в режиме
> реального времени.
> Количество датчиков планируется увеличить до 1500.
> Получаем, что даже при 400 у нас в пиковые моменты кэш "спустую" может
> прогонять (пока дойдет до последней строки в коде КЭШ) 400*70=28000 строк.
>
> Сейчас делается так.
> Если датчик такой то, то делаем (исполняемый код) такой то.
> Оптимизация только в том, что наиболее частые соыбтия расположены вверху
>
> То есть сейчас код нечто вроде
> Если "А" выполняем то то код Кэш "..."
> Если "В" выполняем то то код Кэш "...2.."
> и так до "403"
>
> мне кажется, что это не совсем оптимально. Какие могут быть варианты еще
> для оптимизации?
>
> Код можно не предлагать (не выкладывать), ГЛАВНОЕ ИДЕЯ (код напишем сами).
> Тема <http://www.sql.ru/forum/actualthread.aspx?tid=670799> Ответить
> <http://www.sql.ru/forum/actualpost.aspx?tid=670799> Сообщение
> <http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=670799&msg=7279362>
>
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032802
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaКак вариант "разделить" запись "события" от датчика от "обработки" этих, уже записаных, событий...

Например завести табличку приоритетов и при записи события писать его вместе с его приоритетом... Это т.с. один акт.

Нереально. Приоритетов между ними нет (у нас все профессии важны ;-) ) , есть только те, что чаще всего повторяются. Из 403 на 20 событий приходится около 75% всех сигналов, действий.

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

Как вариант еще иметь несколько процессов по обработке таблички событий, возможно это сделает приоритет более т.с. "активным"...
Посмотрим, может и сработает, но практически то же подход "ВЛОБ", только разделенный на несколько лбов (потоков).
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032813
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaКак вариант "разделить" запись "события" от датчика от "обработки" этих, уже записаных, событий...

Например завести табличку приоритетов и при записи события писать его вместе с его приоритетом... Это т.с. один акт.


Нереально. Приоритетов между ними нет (у нас все профессии важны ;-) ) , есть только те, что чаще всего повторяются. Из 403 на 20 событий приходится около 75% всех сигналов, действий.

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


Автоматически отпадает.

автор Как вариант еще иметь несколько процессов по обработке таблички событий, возможно это сделает приоритет более т.с. "активным"...

Посмотрим, может и сработает, но практически то же подход "ВЛОБ", только разделенный на несколько лбов (потоков).
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032871
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servitИмеем список датчиков и соответствующий им код:
Код: plaintext
1.
2.
3.
4.
^Sensor("A")="^routine1"
^Sensor("B")="sub^routine2(67)"
...
^Sensor("AAB")="##class(Sensor).Test()"

Далее вызываем код в зависимости от сработавшего датчика:
Код: plaintext
1.
2.
set sensor="G"
Do @($G(^Sensor(sensor),"^routineERROR"))
Ещё можно обработку разнести по разным экземплярам Caché с помощью ECP и отображения программ/пакетов.

Представьте себе искуственный интелект, где важна последовательность реакций на события.
Имеем "поток данных"
время, датчик, событие (показатель)
причем за секунду их может быть 70 срабатываний. Поток идет непрерывно. За рабочий день доходит до 800'000.

Если распалалелим их по разным глобалам, чтобы одному датчику была одна база, а дальше что?
Тот же самый опрос, но уже со всех баз данных. К тому же ответная реакция на датчики должна быть в режиме реального времени.
При использовании 400 баз нужно будет увязывать (согласовывать) еще и время (последовательность) наступления событий и ответную реакцию на них.

Не думаю, что быдет выигрыш - явно прослеживается проблема - согласование 400 баз по времени - то есть теперь придется сравнивать - время наступления события.

Самое главное и забыл указать - реакция на событий должна быть примерно в той же последовательности, что и наступление событий, ну максимум 30 секунд задержки.
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032913
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
logist
Я бы делал так.

Заводим глобаль двухуровневую
^Code(Датчик,Событие)=Код
и делаем
if $data(^Code(Датчик,Событие)) xecute ^Code(Датчик,Событие)
Можно выполнять вместо xecute job или писать отдельную очередь
^очередь($i(^очередь))=^Code(Датчик,Событие)
и отдельным уже процессом обходить эту очередь, чтобы не тормозить процесс
который читает датчики.

Как то так.

=Сергей Шутов (logist)
ООО Димас, Хабаровск



Резултаты от датчиков идут потоком "ODBC" так что систему не сильно нагружает.
Цепляется последовательность по "id", которая совпадает практически по времени наступления событий.
"xecute" требует также проверку условия "Если" или наступления опреденного события (в нашем случае).
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032953
lf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
^(событие)="метка^программы"
j метка^программы
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032968
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Повторю что у нас имеется.

Поток данных ODBC, которые составляет другая машина и которые в режиме реального времени записываются в наш класс. В данных прописаны время, название события (с 1 по 403) и значение этого событий.

Мы делаем:
вытаскиваем данные подряд из класса (по возрастанию id, последовательно)
затем в верхних страках If или Xecute с условием (не суть важно, суть одна) прописываем 20 наиболее частых событий (название событий, типа А1, А2, А3, А4-А20)

Затем, оставшиеся событий (сигналы) мы разделили на 2 части - очень редкие и прочие
очень редкие это Z1,Z2,Z3... их штук 50
осталось 403-50-20=333 (счастливое число)
которые мы также разделили на 7
В1,В2,В3...
С1,С2,С3

Что происходит.
Код написан следующим образом
Сперва идет проверка на предмет наступления наиболее частого события.
Затем проверка на В, или С, или..., или Z
Нашли, что это С
переход на группу событий С и делаем ту же выборку
Если С1 = ..., то такой то код.

Проверка Если = идет вроде бы быстро, но сам факт "пустой проверки на название датчика - тупым перебором" не особо радует.

Получается- что много частых, неэффективных проверок, которые через 8 часов приводят к задержке реакции на наступившие события примерно на 5-9 минут, что в нашем случае непременимо.

Дальнейшее дробление на группы событий ощутимого выигрыша не дает (не аткого как ждали).

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

Представьте скаутов опытных и не очень (почему скаутов - не знаю).
Те что не опытные - на предмет сбора трав - начинаю листать справочник и проверять какая трава и можно ли её есть/заваривать чай. и так для каждой травы - перелистывания справочника на 400 страниц.

Оптыный скаут - видит траву, справочник не перелистывает, а сразу знает что с ней можно/нужно деалть.

К тому же стремимся и мы.


Другие похожие направления - биржа. есть события - нужна реакция (молниеносная).
Или проверка самолета. Если возникла ошибка, нужна реакция (опять моментальная).
Если таких событий масса, то перебор всего списка сыграет роковую роль.
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032981
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fotopravka.ru
Или проверка самолета.

Имелось ввду испытания нового самолета в воздухе, в котором масса недочетов в электронике и нужны быстрые ответные реакции
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032984
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lf^(событие)="метка^программы"
j метка^программы

То же самое и делаем, но может быть есть что то более "логическое", более быстрое, не требующее перебора многих событий, пока попадется "текущее событие", чтобы выполнить ответный код (создать ответную реакцию) для этого событий
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36032992
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fotopravka.ru
Проверка Если = идет вроде бы быстро, но сам факт "пустой проверки на название датчика - тупым перебором" не особо радует.

Получается- что много частых, неэффективных проверок, которые через 8 часов приводят к задержке реакции на наступившие события примерно на 5-9 минут, что в нашем случае непременимо.

Повторюсь, за день проходит до 800 000 событий и на все на них нужно дать ответную реакцию.

800000*50 (перебор строк) = 40 млн бесполезных исполняемых строк кода!!!
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033032
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fotopravka.ruПовторю что у нас имеется.

Поток данных ODBC, которые составляет другая машина и которые в режиме реального времени записываются в наш класс. В данных прописаны время, название события (с 1 по 403) и значение этого событий.


ODBC вроде как не сильно быстрый ... не ?

fotopravka.ru
Мы делаем:
вытаскиваем данные подряд из класса (по возрастанию id, последовательно)
затем в верхних страках If или Xecute с условием (не суть важно, суть одна) прописываем 20 наиболее частых событий (название событий, типа А1, А2, А3, А4-А20)

Затем, оставшиеся событий (сигналы) мы разделили на 2 части - очень редкие и прочие
очень редкие это Z1,Z2,Z3... их штук 50
осталось 403-50-20=333 (счастливое число)
которые мы также разделили на 7
В1,В2,В3...
С1,С2,С3

Что происходит.
Код написан следующим образом
Сперва идет проверка на предмет наступления наиболее частого события.
Затем проверка на В, или С, или..., или Z
Нашли, что это С
переход на группу событий С и делаем ту же выборку
Если С1 = ..., то такой то код.


Почему бы не составить матрицу событий :

^matrix(код события)=группа события, обработчик события

и проверять её элементарным $DATA(^matrix(код события)) c последующим $GET(^matrix(код события))

fotopravka.ru
Проверка Если = идет вроде бы быстро, но сам факт "пустой проверки на название датчика - тупым перебором" не особо радует.


Что то я не пойму - а запись полученная через ODBC разве не однозначно определяет название датчика ?
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033061
lf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь нет перебора, будьте внимательнее.
Фактически выполняется:
j @^global(событие)

fotopravka.rulf^(событие)="метка^программы"
j метка^программы

То же самое и делаем, но может быть есть что то более "логическое", более быстрое, не требующее перебора многих событий, пока попадется "текущее событие", чтобы выполнить ответный код (создать ответную реакцию) для этого событий
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033072
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От "пустых проверок" уйти легко, например так:
Код: plaintext
1.
2.
3.
4.
if type="A1" {..код1..}
elseif type="A2" {..код2..}
...
elseif type="AN" {..кодN..}
else {..неверный код..}
заменяем на:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
s $zt="WrongCode" g @type
A1 код1
A2 код2
...
AN кодN

WrongCode s $zt=""
  ..неверный код..
  q
Но: Вы профилировали Ваш код? Почему уверены, что именно "пустые проверки" являются источником торможения?
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033086
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имел в виду, конечно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
s $zt="WrongCode" g @type
A1 код1
   quit
A2 код2
   quit
...
AN кодN
   quit

WrongCode s $zt=""
  ..неверный код..
  quit
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033101
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как насчет использования триггеров
при добавлении строки в класс сразу обработаете нужное событие
быстрее чем триггер по-моему вы не отреагируете на появление события, и отслеживать нет необходимости, только главное выполнение операция по нужному событию вывести в отдельный процесс, тогда у вас не будет задержек в обработке транзакций
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033323
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ptn
ODBC вроде как не сильно быстрый ... не ?
Систему не загружает, (нагрузка 1-3% всего), Со своей задачей справляется, сбоев и проблем не замечено. Удобно, просто.

fotopravka.ru
Почему бы не составить матрицу событий :
^matrix(код события)=группа события, обработчик события
и проверять её элементарным $DATA(^matrix(код события)) c последующим $GET(^matrix(код события))

То же вариант. Надо бедет побробнее проанализировать.


fotopravka.ru
Что то я не пойму - а запись полученная через ODBC разве не однозначно определяет название датчика ?

Все правильно, определяет название датчика, и в зависимости от названия (срабатывания датчика) выполняется жеско привязанный к этому датчику код.
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033348
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lfЗдесь нет перебора, будьте внимательнее.
Фактически выполняется:
j @^global(событие)


Я может не совсем понимаю Вас.
Речь идет об общей базе на все события или на каждое событие - своя база (вссего 403 базы)
и после наступления события выполняется код. Тогда как с очередность - постоянно опрашивать все базы на предмет появления нового значения/сигнала.
Как тогда быть с очередностью. Не совсем понимаю.

Вообще оператор косвенности как черт ладона боюсь. Вроде бы все понятно, а в работе не применяю, так как с ним вечно путаюсь. Не люблю я их. Но это уже вопрос предпочтительности. Если надо, то можно и вгрызться в это оператор.

Но вопрос остается открытым - ведется одна база или 403. И если 403, то как быть с очередностью. а если одна - то где же здесь экономия. тот же самый анализ наступившего события из череды возможных и применения соответсвующего кода к данному событию.
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033356
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorа как насчет использования триггеров
при добавлении строки в класс сразу обработаете нужное событие
быстрее чем триггер по-моему вы не отреагируете на появление события, и отслеживать нет необходимости, только главное выполнение операция по нужному событию вывести в отдельный процесс, тогда у вас не будет задержек в обработке транзакций
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST

Интересно. надо тоже будет попробовать. Правда придется многое переделывать, но скорость гораздо важнее.
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033366
fotopravka.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey MaslovИмел в виду, конечно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
s $zt="WrongCode" g @type
A1 код1
   quit
A2 код2
   quit
...
AN кодN
   quit

WrongCode s $zt=""
  ..неверный код..
  quit



Сколько новых вариантов предложили. Ну вот, теперь есть что пробовать.
А то мозги уже прикипели и все крутились в одной области.
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033406
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в ECP фактически используется 1 база, но она распределяется между несколькими серверами для снижения нагрузки на основной, т.е. выполнение кода идет на ECP-"клиенте" а данные хранятся на ECP-"сервере"

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033877
Фотография ceshka_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можете использовать:
структура:
^PROCESSES(nProcesses,"label^routine")="A1" ; ибо количество процессов может совпасть

s iFind=0
s myNumber="" f s myNumber=$O(^PROCESSES(myNumber),-1) q:(myNumber="") D q:(iFind) ; думаем, что нам нужно (например проверку на блокировку узла), при необходимости ставим iFind=1
L +:^PROCESSES(myNumber,"label^routine")
x @^PROCESSES(myNumber,$O(^PROCESSES(myNumber,""),-1)) ; тут тоже можно проверку или вычисляемую строку вместо $O(^PROCESSES(myNumber,""),-1), в общем, по желанию
S ^PROCESSES(myNumber+1,"label^routine")="A1"
K ^PROCESSES(myNumber,"label^routine")
L -:^PROCESSES(myNumber,"label^routine")

еще вариант: собрать статистику по самой ОС о количестве запущенных процессов по каждой рутине, но для 1500 это повесит сервер (но, это просто идея)))
...
Рейтинг: 0 / 0
Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
    #36033884
Фотография ceshka_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, сюда ^PROCESSES(myNumber+1,"label^routine") тоже блокировку
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Есть 1000 событий и на каждое - своя реакция. Как оптимизировать в Cache
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]