2009-07-25 28 views
0

我目前正在使用Drools 5.0編寫應用程序。這個應用程序似乎運行速度有點慢,但我有一個理論爲什麼。此應用程序接收許多已存儲在知識會話中的事實更新。引擎蓋下的Drools更新功能確實可以縮回,然後插入。這個應用程序有200多條規則。當某些事實被移除時,一些規則被寫入火中。當某些事實被置入知識會話中時,其他規則被寫入火中。由於更新確實會收回,那麼在更新過程中,插入是否會導致收回和插入相關的規則?即使知識會議中沒有真正被「插入」或撤回的東西?Drools更新方法可能會導致我的問題

有一點需要注意,我將WorkingMemoryFileLogger吸引到了我的知識會議中,以更好地瞭解發生了什麼。那是當我看到很多意外的撤回/插入規則激活創建被添加到議程中,但似乎他們不會被激活。在我看來,更新事實可能是昂貴的,尤其是基於您的事實模型,我應該謹慎使用。它是否正確?

回答

0

我認爲你已經正確地理解了它。更新有點像收縮和斷言。 首先要確定的是,如果你的規則給你你想要的東西 - 即做到這一點,但你只是想提高性能?

在某些方面,您可以將更新(也可以檢查「修改」關鍵字..)作爲不可變性邪惡的一部分;)當您更新時 - 您告訴網絡事實已發生變化,但它還沒有在現場級別(即TBD)跟蹤它,所以它可能會導致更多的工作,然後是必要的,因爲所有這些激活都是不需要的(因爲它們使用的值實際上並未改變) 。難以更具體 - 如果您提供了一些樣本規則/事實模型(如果您當然可以以安全的方式!),我們可能會提出一些想法來將其細分爲更細粒度。

祝你好運!

+0

感謝Micheal的迴應。你已經證實了我的懷疑。就準確性而言,引擎似乎工作正常,但我的答案是潛在的,因爲處理所有規則/事實花費的時間太長。 我對如何重構事實模型有一些想法,但是想驗證我正在關注正確的問題,因爲我的重構工作可能需要一段時間。 再次感謝! – loyalBrown 2009-07-27 01:40:30

0

要知道的最好方法是配置應用程序,並找出發生了什麼。將OptimizeIt或JProbe與JDK 1.6附帶的jvisualvm.exe結合使用。不要猜測 - 獲取更多數據。

+0

我已經介紹了我的應用程序。我的大部分時間都是在作爲Drools界面一部分的fireAllRules調用中消耗的。該調用如何執行取決於我的規則設計和事實模型。我希望有人對Drools的ReteOO實現比我更深入的理解,可以提供一些有關事實更新而不是斷言時發生的事情的洞察。另外,告訴我這可能會如何影響fireAllRules調用。 – loyalBrown 2009-07-26 00:58:01

0

根據我的經驗,只有在當前執行規則的上下文中需要通過WHERE子句重新評估實體時,update()方法纔是必需的。由於RETE評估在規則輸入時一次性發生,因此刪除一些update()語句(在可能的情況下)將加快執行速度。有時這涉及設置一些標誌並推遲實際的update(),直到後來的規則。您還可以將當前實體狀態的一些評估放入THEN子句中的if語句中,並使用WHERE子句進行更基本的過濾。

相關問題