0

現在、Drools 5.0 を使用してアプリケーションを作成しています。このアプリケーションの実行は少し遅いようですが、その理由については理論があります。このアプリケーションは、ナレッジ セッションに既に格納されているファクトの多くの更新を受け取ります。内部の Drools 更新機能は、実際には撤回を行ってから挿入を行います。このアプリケーションには 200 以上のルールがあります。一部のルールは、特定の事実が削除されたときに実行されるように記述されています。他のルールは、特定の事実がナレッジ セッションにアサートされたときに実行されるように記述されています。更新は実際に撤回を行い、次に挿入を行うため、更新中に撤回と挿入に関連するルールが引き続き実行されますか? ナレッジ セッションから実際に「挿入」または撤回されているものは何もないのに?

注意すべきことの 1 つは、WorkingMemoryFileLogger をナレッジ セッションに「接続」して、何が起こっているかをよりよく理解できるようにすることです。その時、予定外の撤回/挿入ルールのアクティブ化の作成が議題に追加されているのを見ましたが、アクティブ化されることはないようです. 事実の更新は、特に事実モデルに基づいて費用がかかる可能性があるように思えますが、控えめに使用する必要があります。これは正しいです?

4

3 に答える 3

0

私の経験では、 update() メソッドは、現在実行中のルールのコンテキスト内で WHERE 句によってエンティティを再評価する必要がある場合にのみ必要です。RETE 評価はルールのエントリ時に一度に行われるため、いくつかの update() ステートメント (可能な場合) を削除すると、実行速度が向上します。これには、いくつかのフラグを設定し、実際の update() を後のルールまで延期することが含まれる場合があります。より基本的なフィルタリングに WHERE 句を使用して、現在のエンティティ状態の評価の一部を THEN 句の if ステートメントに入れることもできます。

于 2009-10-24T18:16:28.377 に答える
0

知るための最良の方法は、アプリのプロファイルを作成し、何が起こっているかを正確に調べることです。JDK 1.6 に同梱されている jvisualvm.exe と組み合わせて、OptimizeIt や JProbe などを使用します。推測しないでください。より多くのデータを取得してください。

于 2009-07-26T00:33:43.670 に答える
0

あなたはそれを正しく理解していると思います。更新は、リトラクトとアサートのようなものです。最初に確認すべきことは、ルールが目的を達成しているかどうかです。つまり、ルールは機能しているかどうか、パフォーマンスを向上させたいだけかどうかです。

いくつかの点で、更新を不変性の弊害の一部と考えることができます (また、「変更」キーワードをチェックアウトします..) 更新すると、事実が変更されたことをネットワークに伝えますが、まだ変更されていません。フィールド レベル (つまり TBD) で追跡するため、必要以上の作業が発生する可能性があります。実際には必要のないアクティベーションがすべて作成されるためです (実際には値が変化しないフィールドを使用しているため)。

より具体的にするのは難しい - いくつかのサンプル ルール/ファクト モデルを提供した場合 (もちろん安全な方法で可能であれば!)、それをより細かく分類するためのいくつかのアイデアを提案できるかもしれません。

幸運を !

于 2009-07-26T23:23:31.637 に答える