在大量处理中使用Drools

在大量处理中使用Drools

Using Drools in a heavy batch process

我们使用Drools作为解决方案的一部分,在非常紧张的处理应用程序中充当一种过滤器,也许在500,000个工作内存对象上运行多达100条规则。
事实证明,它非常慢。
其他人在批处理处理应用程序中使用Drools有任何经验吗?


我使用了Drools,其状态记忆包含超过1M个事实。通过对规则和基础JVM进行一些调整,在最初启动几分钟后,性能可能会非常好。如果您需要更多详细信息,请告诉我。


种类取决于您的规则-如果有足够的内存,则500K个对象是合理的(必须在内存中填充一个RETE网络,因此内存使用量是500K个对象的倍数-即用于网络结构,索引等的对象空间) -有可能您正在分页到磁盘,这确实很慢。

当然,如果您有匹配相同类型事实组合的规则,则可能导致尝试组合的爆炸式增长,即使您只有1条规则,也确实会非常慢。
如果您有更多有关分析的信息,则可能会提供可能的解决方案。


我只是在学习自己Drools,所以也许我想念一些东西,但是为什么将整批的五十万个对象一次添加到工作内存中呢?我能想到的唯一原因是,只有当批次中的两个或多个项目相关时,规则才会生效。

如果不是这种情况,那么也许您可以使用无状态会话并一次声明一个对象。我认为规则在这种情况下的运行速度将提高50万倍。

即使是这种情况,您的所有规则都需要访问所有500k对象吗?您能否通过一次应用一个项目规则来加快处理速度,然后在处理的第二阶段中使用不同的规则库和工作内存来应用批处理级别的规则?这不会改变数据量,但是RETE网络会更小,因为简单的规则将被删除。

另一种方法是尝试在第二阶段中识别对象的相关组并在组中声明这些对象,从而进一步减少工作内存中的数据量以及拆分RETE网络。


我还没有使用最新版本的Drools(我上次使用它是大约一年前),但是那时我们的高负载基准测试证明它完全慢。在基于我们的许多体系结构之后,这非常令人失望。

至少我记得关于Drools的一件好事是他们的开发团队可以在IRC上使用,并且非常有帮助,您可以尝试一下,毕竟他们是专家:irc.codehaus.org #drools


解析几千个对象后,我遇到了OutOfMemory错误的问题。设置其他默认优化程序可以解决此问题。

1
OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);

使用无状态会话并一次添加一个对象?


Drools并非真正设计为可以在大量对象上运行。它针对在一些对象上运行复杂的规则进行了优化。

每个其他对象的工作内存初始化太慢,并且缓存策略被设计为每个工作内存对象都可以工作。


我们也在看Drools,但是对我们来说,对象的数量很少,所以这不是问题。我确实记得读过一篇文章,该算法有多个替代版本,它们更多地考虑了内存使用情况,并且针对速度进行了优化,同时仍基于同一算法。不知道它们是否已经变成了真正的可用库。


此优化器也可以通过使用参数来设置
-Dmvel2.disable.jit = true


推荐阅读