Может ли метод обновления Drools вызывать мои проблемы?

В настоящее время я пишу приложение, используя Drools 5.0. Это приложение, кажется, работает немного медленно, но у меня есть теория, почему. Это приложение получает много обновлений для фактов, уже сохраненных в сеансе знаний. Функция обновления Drools под капотом действительно выполняет втягивание, а затем вставку. Это приложение имеет более 200 правил. Некоторые правила написаны так, чтобы срабатывать при удалении определенных фактов. Другие правила написаны так, чтобы срабатывать, когда определенные факты утверждаются в сеансе знаний. Поскольку обновление действительно выполняет отзыв, а затем вставку, будут ли правила, связанные с отзывом и вставкой, по-прежнему срабатывать во время обновления? Даже несмотря на то, что на самом деле ничего не «вставляется» и не удаляется из сеанса знаний?

Следует отметить одну вещь: я «подключил» WorkingMemoryFileLogger к своему сеансу знаний, чтобы получить лучшее представление о том, что происходит. Именно тогда я увидел множество неожиданных творений активации правил отмены/вставки, добавленных в повестку дня, но, похоже, они никогда не активируются. Мне кажется, что обновление фактов может быть дорогостоящим, особенно на основе вашей модели фактов, и его следует использовать экономно. Это правильно?


person loyalBrown    schedule 25.07.2009    source источник


Ответы (3)


Я думаю, вы поняли это правильно. Обновление похоже на отзыв плюс утверждение. Первое, в чем нужно убедиться, это в том, что ваши правила дают вам то, что вы хотите, т. е. работают ли они, но вы просто хотите улучшить производительность?

В некотором смысле вы можете думать об обновлении (а также проверить ключевое слово «изменить» ..) как о части зла неизменности;) Когда вы обновляете - вы сообщаете сети, что факт изменился, но это еще не так. отслеживайте его на уровне поля (то есть подлежит уточнению), поэтому это может вызвать больше работы, чем необходимо, поскольку создаются все эти активации, которые на самом деле не нужны (поскольку они используют поля, которые фактически не изменились в значении).

Трудно быть более конкретным - если вы предоставили примерную модель правил/фактов (если вы можете, конечно, безопасным способом!), мы могли бы предложить некоторые идеи, чтобы разбить ее, чтобы она была более детализированной.

Удачи !

person Michael Neale    schedule 26.07.2009
comment
Спасибо за ответ Михаил. Вы подтвердили мои подозрения. Кажется, что с точки зрения точности движок работает правильно, но мои ответы скрыты, потому что обработка всех правил/фактов занимает слишком много времени. У меня есть несколько идей по рефакторингу фактографической модели, но я хотел убедиться, что сосредоточился на правильной проблеме, поскольку мой рефакторинг может занять некоторое время. Спасибо еще раз! - person loyalBrown; 27.07.2009

Лучший способ узнать это — составить профиль приложения и узнать, что именно происходит. Используйте что-то вроде OptimizeIt или JProbe в сочетании с jvisualvm.exe, который поставляется с JDK 1.6. Не гадать - получить больше данных.

person duffymo    schedule 26.07.2009
comment
Я уже профилировал свое приложение. Большая часть моего времени уходит на вызов fireAllRules, который является частью интерфейса Drools. То, как работает этот вызов, зависит от моего дизайна правил и модели фактов. Я надеялся, что кто-то, у кого есть более глубокое понимание реализации ReteOO в Drools, чем я, мог бы дать некоторое представление о том, что именно происходит, когда факты обновляются, а не утверждаются. Кроме того, скажите мне, как это может повлиять на вызов fireAllRules. - person loyalBrown; 26.07.2009

По моему опыту, метод update() необходим только в том случае, если вам нужно переоценить сущность с помощью предложения WHERE в контексте текущего выполняемого правила. Поскольку оценка RETE происходит сразу после ввода правила, удаление некоторых операторов update() (где это возможно) ускорит его выполнение. Иногда это включает в себя установку некоторых флагов и откладывание реального update() до более позднего правила. Вы также можете поместить часть оценки текущих состояний объекта в оператор if в предложении THEN, используя предложение WHERE для более простой фильтрации.

person CZahrobsky    schedule 24.10.2009