Использование Drools в тяжелых пакетных процессах

StackOverflow https://stackoverflow.com/questions/92985

  •  01-07-2019
  •  | 
  •  

Вопрос

Мы использовали Drools как часть решения, которое действует как своего рода фильтр в очень интенсивном обрабатывающем приложении, возможно, выполняющем до 100 правил для более чем 500 000 объектов рабочей памяти.оказывается, что это очень медленно.у кого-нибудь еще есть опыт использования Drools в приложении пакетной обработки?

Это было полезно?

Решение

Я не работал с последней версией Drools (последний раз я использовал ее около года назад), но тогда наши тесты с высокой нагрузкой показали, что она крайне медленная.Огромное разочарование после того, как на его основе была построена большая часть нашей архитектуры.

По крайней мере, что-то хорошее, что я помню о drools, это то, что их команда разработчиков была доступна в IRC и была очень полезна, вы можете дать им попробовать, в конце концов, они эксперты: irc.codehaus.org #слюни

Другие советы

Вид зависит от ваших правил - 500 КБ объектов разумно при наличии достаточного количества памяти (он должен заполнить сеть RETE в памяти, поэтому использование памяти кратно объектам 500 КБ - т.е. пространство для объектов + пространство для сетевой структуры, индексов и т. д.) - это возможно, вы выполняете пейджинг на диск, что будет очень медленно.

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

Я использовал Drools с рабочей памятью с сохранением состояния, содержащей более 1 миллиона фактов.После некоторой настройки как ваших правил, так и базовой JVM, производительность может быть довольно хорошей уже через несколько минут после первоначального запуска.Дайте мне знать, если вы хотите получить более подробную информацию.

Я сам только учусь, пускает слюни, так что, возможно, я что-то упускаю, но почему в рабочую память сразу добавляется вся партия из пятисот тысяч объектов?Единственная причина, о которой я могу думать, заключается в том, что существуют правила, которые вступают в силу только тогда, когда два или более элементов в пакете связаны.

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

Даже если это так, всем ли вашим правилам нужен доступ ко всем 500 тысячам объектов?Можете ли вы ускорить процесс, применяя правила для каждого элемента по одному, а затем на втором этапе обработки применяя правила пакетного уровня, используя другую базу правил и рабочую память?Это не изменило бы объем данных, но сеть RETE стала бы меньше, поскольку простые правила были бы удалены.

Альтернативный подход — попытаться идентифицировать связанные группы объектов и объединить объекты в группы на втором этапе, что еще больше уменьшит объем данных в рабочей памяти, а также разделит сеть RETE.

Drools на самом деле не предназначен для запуска на огромном количестве объектов.Он оптимизирован для выполнения сложных правил на нескольких объектах.

Инициализация рабочей памяти для каждого дополнительного объекта происходит слишком медленно, а стратегии кэширования предназначены для работы с каждым объектом рабочей памяти.

У меня возникли проблемы с ошибками OutOfMemory после анализа нескольких тысяч объектов.Установка другого оптимизатора по умолчанию решила проблему.

OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);

Мы тоже смотрели на слюни, но для нас количество объектов невелико, так что это не проблема.Я помню, что читал, что существуют альтернативные версии одного и того же алгоритма, которые больше учитывают использование памяти и оптимизированы по скорости, но при этом основаны на том же алгоритме.Однако не уверен, что кто-то из них превратился в настоящую полезную библиотеку.

Использовать сеанс без сохранения состояния и добавлять объекты по одному?

Этот оптимизатор также можно установить с помощью параметра -dmvel2.disable.jit = true

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top