Использование Drools в тяжелом пакетном процессе
Мы использовали Drools как часть решения, чтобы действовать как своего рода фильтр в очень интенсивном приложении обработки, возможно, до 100 правил на 500 000 + рабочих объектов памяти.
оказывается, что он очень медленный.
у кого-нибудь еще есть опыт использования Drools в приложении обработки пакетного типа?
Ответы
Ответ 1
Я не работал с последней версией Drools (в прошлый раз, когда я использовал ее примерно год назад), но тогда наши тесты с высокой нагрузкой доказали, что она очень медленная. Огромное разочарование после того, как он основал большую часть нашей архитектуры.
По крайней мере, что-то хорошее, что я помню о слюнях, заключается в том, что их команда разработчиков была доступна в IRC и очень полезна, вы можете попробовать, они ведь эксперты: irc.codehaus.org #drools
Ответ 2
Вид зависит от ваших правил. Объекты 500K разумны, учитывая достаточную память (он должен заполнять сеть RETE в памяти, поэтому использование памяти несколько из 500K объектов - т.е. пространство для объектов + пространство для структуры сети, индексы и т.д. ) - возможно, вы подкачки на диск, который будет очень медленным.
Конечно, если у вас есть правила, которые соответствуют комбинациям одного и того же типа, это может вызвать взрыв комбинаций, который, даже если у вас есть 1 правило, будет действительно очень медленным.
Если бы у вас была больше информации о анализе, который вы делаете, это, вероятно, поможет с возможными решениями.
Ответ 3
Я использовал Drools с работоспособной памятью, содержащей более 1 миллиона фактов. При некоторой настройке как ваших правил, так и базовой JVM производительность может быть неплохой после нескольких минут для первоначального запуска. Дайте мне знать, если вы хотите получить более подробную информацию.
Ответ 4
Я просто изучаю слюни самостоятельно, так что, может быть, я чего-то не хватает, но почему вся партия из пятисот тысяч объектов добавлена в рабочую память сразу? Единственная причина, по которой я могу думать, это то, что есть правила, которые срабатывают только тогда, когда связаны два или более элемента в пакете.
Если это не так, то, возможно, вы могли бы использовать сеанс без состояния и одновременно утверждать один объект. Я предполагаю, что в этом случае правила будут работать в 500k раз быстрее.
Даже если это так, все ли ваши правила требуют доступа ко всем 500k-объектам? Не могли бы вы ускорить процесс, применяя правила по каждому пункту за раз, а затем на втором этапе обработки применяете правила уровня партии, используя другую базу правил и рабочую память? Это не изменило бы объем данных, но сеть RETE была бы меньше, потому что простые правила были бы удалены.
Альтернативный подход состоял бы в том, чтобы попытаться идентифицировать связанные группы объектов и утвердить объекты в группах во время второй фазы, дополнительно уменьшив объем данных в рабочей памяти, а также разделив сеть RETE.
Ответ 5
Drools на самом деле не предназначен для работы на огромном количестве объектов. Он оптимизирован для выполнения сложных правил для нескольких объектов.
Инициализация рабочей памяти для каждого дополнительного объекта слишком медленная, и стратегии кэширования предназначены для работы на каждый рабочий объект памяти.
Ответ 6
Мы также смотрели на слюни, но для нас количество объектов невелико, так что это не проблема. Я помню, что читал, что есть альтернативные версии того же алгоритма, которые учитывают использование памяти в большей степени, и оптимизированы для скорости, все еще основываясь на одном и том же алгоритме. Не уверен, что кто-либо из них превратил его в настоящую полезную библиотеку.
Ответ 7
Использовать сеанс без сохранения состояния и добавлять объекты по одному за раз?
Ответ 8
У меня были проблемы с ошибками OutOfMemory после разбора нескольких тысяч объектов. Настройка другого оптимизатора по умолчанию решила проблему.
OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);
Ответ 9
этот оптимизатор также может быть установлен с помощью параметра
-Dmvel2.disable.jit = TRUE