我在我的系統中執行一些評估實驗,檢查插入不同(在規則數目中)規則庫和事實數量所花費的時間記憶。注意:我沒有使用持久性。 Drools版本:6.3.0.Final。表 - 規則庫(RB),插入時間(TTI),時間(以毫秒爲單位)。 在工作記憶中插入事實的時間根據規則庫大小增加
根據上面的表格,我想知道爲什麼在規則庫大小增加時將事實包含在內存中的時間增加了?
我不是Drools的專家。
我在我的系統中執行一些評估實驗,檢查插入不同(在規則數目中)規則庫和事實數量所花費的時間記憶。注意:我沒有使用持久性。 Drools版本:6.3.0.Final。表 - 規則庫(RB),插入時間(TTI),時間(以毫秒爲單位)。 在工作記憶中插入事實的時間根據規則庫大小增加
根據上面的表格,我想知道爲什麼在規則庫大小增加時將事實包含在內存中的時間增加了?
我不是Drools的專家。
事實上,只要網絡給定狀態可能,插入,撤回和更新結果即時評估條件。它不僅僅是規則的號碼;這是事實類型的引用數量。
您觀察到小於O(N)的增加,N是規則的數量,很適合該理論。
12,000條規則的數量非常非凡(除非您已經發明瞭規則來測試可伸縮性)。如果它們是真實的,並且如果你擔心表現,你應該修改規則結構。
編輯由於OP的評論。
「事實類型的引用數」是特定類(=類型)在模式中發生的次數。在你的例子
rule x when
$spec1 : Specification ()
$spec2 : Specification ($spec1.id ==2, id == 3, value > $spec1.value)
rule "x+1" when
$spec1 : Specification ()
$spec2 : Specification ($spec1.id ==3, id == 4, value > $spec1.value)
你有2條規則,但4個引用Specification
。這勢必會在引擎中創建更復雜的網絡。此外,根據專有約束第一模式($spec1.id ==X
)中的數據但發生在第二模式幾乎肯定是反模式。
使用這些差的結構,減慢RBS幾乎沒有限制,不僅僅是Drools。顯然你確實只是測試可伸縮性。堅持寫得好的規則可能會給你更確切的結果。
你是否使用持久性?那將是一個罪魁禍首。另一件事是,在會話中,規則的左側(when部分)在事實的插入時被評估。所以規則越多,評估越多,時間越多。 – pandaadb
我沒有使用持久性。非常感謝你。 – WillEnsaba
所以,我不是100%確定這一點,但我讀了關於一個伎倆。你想嘗試嗎?在你的規則中,添加另一個匹配對象,任何隨機對象都可以。這將導致所有規則只在該對象可用時才評估爲真。現在將您的3/6/12k事實插入到您的會話中。不要直到最後才插入最後一個對象。這應該會使你的引擎在O(1)中評估所有事實的錯誤,然後在最後一個能夠支持你的規則的事實上對所有事實進行匹配。 – pandaadb