在大批量过程中使用 Drools

Posted

技术标签:

【中文标题】在大批量过程中使用 Drools【英文标题】:Using Drools in a heavy batch process 【发布时间】:2010-09-10 17:10:31 【问题描述】:

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

【问题讨论】:

谁能说一下上面的问题,是否真的有可能在内存中存在许多事实并以高性能同时调用规则。 【参考方案1】:

取决于您的规则 - 500K 对象是合理的给定足够的内存(它必须在内存中填充 RETE 网络,因此内存使用量是 500K 对象的倍数 - 即对象空间 + 网络结构、索引等空间) - 您可能正在分页到磁盘,这会非常慢。

当然,如果您有匹配相同类型事实组合的规则,则可能会导致尝试组合爆炸,即使您有 1 条规则也会非常慢。 如果您有更多关于您正在做的分析的信息,这可能会帮助您找到可能的解决方案。

【讨论】:

嗨@Michael,你能详细说明一下分页到磁盘吗?当我不断插入事实时,我面临着缓慢的问题。对于前几千个事实,它工作正常。但稍后,它将停止调用规则,并且很少会在某个时间间隔内执行一组规则。这有什么问题?【参考方案2】:

我使用了带有状态工作记忆的 Drools,其中包含超过 100 万个事实。通过对规则和底层 JVM 进行一些调整,初始启动几分钟后性能会非常好。如果您想了解更多详情,请告诉我。

【讨论】:

我对这些细节很感兴趣,你能和我们分享一下吗?我还在大量数据上运行 Drools,任何调整都会很棒。 请分享详细信息,我有兴趣。 很遗憾,我已经记不起太多了!【参考方案3】:

我没有使用过最新版本的 Drools(我上次使用它是大约一年前),但当时我们的高负载基准测试证明它非常缓慢。在我们的大部分架构都基于它之后,我们感到非常失望。

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

【讨论】:

【参考方案4】:

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

如果不是这样,那么也许您可以使用无状态会话并一次断言一个对象。我假设在这种情况下规则的运行速度会快 50 万倍。

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

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

【讨论】:

【参考方案5】:

Drools 并不是真正为在大量对象上运行而设计的。它针对在少数对象上运行复杂规则进行了优化。

每个附加对象的工作内存初始化太慢,并且缓存策略旨在为每个工作内存对象工作。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

解析几千个对象后,我遇到了 OutOfMemory 错误的问题。设置一个不同的默认优化器解决了这个问题。

OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);

【讨论】:

【参考方案8】:

我们也在研究流口水,但对我们来说,对象的数量很少,所以这不是问题。我确实记得读过相同算法的其他版本,它们更多地考虑了内存使用情况,并且针对速度进行了优化,同时仍然基于相同的算法。不过,不确定它们中是否有人将其变成了真正可用的库。

【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于在大批量过程中使用 Drools的主要内容,如果未能解决你的问题,请参考以下文章

同步框架:如何在中心辐射模型中启用批量插入/更新/删除存储过程

[MSSQL]批量删除表名包含某字符串的数据表&批量删除存储过程包含某字符串的存储过程

toad for oracle可否批量导出存储过程

使用存储过程将批量数据插入主/明细表的最佳方法?

Mybatis批量插入数据的两种方式

Mybatis批量插入数据的两种方式