5

私は100k以上の一意の入力を受け入れるアプリケーションに取り組んでいます-簡単にするために、各入力が浮動小数点値(a、b、c ...など)であると仮定します-ただし、文字列などでもかまいません。アプリケーションには多くのルールがあります/これらの入力に関連するイベント/トリガー。

例1:

Rule[(a > b) and (c <= d)] --> [execute EventX]

定義 1:上記のルールは次のように述べています。

例 2:

Rule[x != x.prev] --> [execute EventZ]

定義 2:上記のルールは次のように述べています。値の更新後、入力 'x' の現在の値が以前の値と等しくない (値が変更された) EventZ を実行する

私が見つけたのは、入力の数が増加し、ルールの数が増加するにつれて、「特定の」ルールを評価し、イベントをトリガーする必要があるかどうかを判断するために必要な計算の総量が制御不能になっていることです-Throwingより速く、より多くのハードウェアを問題に使用しても、期待どおりにスケーリングされません。

現時点では、新しい入力が更新されるたびに、関連する入力/変数が、変数をそれを含むルールにマップするハッシュ テーブルで検索されます。その後、これらの各ルールが評価され、結果が true またはアクション可能である場合、関連するイベントが非同期でトリガーされます。

この問題は複雑なイベント処理の領域にあります。残念ながら、この領域のアーキテクチャのほとんどは、上で説明したのと同じデッドヘッド アプローチを使用しています。おそらく、物事が評価/再評価される頻度に関連するいくつかの改良が加えられています。アイデアは、ほぼリアルタイムで反応できるシステムを持つことです。いくつかの状況では、少数の入力がアクティブなルールの 95% 以上に存在するため、ルールと入力を複数のノードに分散することもうまく機能していないようです。

この問題、データ/構造、またはアルゴリズムを解決するためのより良い方法を知っている仲間のSO'erがそこにいることを望んでいました。

私が念頭に置いている単純なアイデアは、従属論理推論のリストを構築できるということです。

そのような2つのルールがある場合:

Rule[a < b] --> [exec E1]
Rule[b >= a] --> [exec E2]

次に、「a」または「b」のいずれかの更新で両方の評価が必要になることはありませんが、そのような論理推論構造の構築は非常に複雑でエラーが発生しやすく、完全かつ厳密にテストするのが難しいことがわかりました。

入力は、株価、温度センサーなどを表す可能性があります。

さらに注意してください。入力の一部は時間的に制約されています。つまり、ルールでは、変数の状態が一定時間特定の位置/状態にある必要がある場合があります (例: 過去 30 秒間の MSFT の価格 > 20 ドル)。現在、これは 0 または 1 /false または true のいずれかの値を持つ「表現変数」(ファサード) を使用して実現されています (変数の値は別のメカニズムによって決定され、通常はトリガーされたルールの結果です) )。

また、ほぼリアルタイムの制約と 1 秒あたりに生成されるデータ量のために、トリガーとストアド プロシージャを備えた DB を使用するオプションは問題外であることに注意してください。

4

3 に答える 3

8

いくつかのアイデア。

ルールの条件が接続詞である場合は、満たされていない条件ごとに満たされていない用語を維持します。その用語のチェック リストにのみルールを配置します。条件が満たされた場合は、他の条件をスキャンして、条件がトリガーされたか、満たされていない別の条件があるかを判断します。(このトリックについては、SAT ソルバーのコンテキストで学んだように思います。)

10 <= x <= 50 のような項がある場合は、ハッシュの代わりにインターバル ツリーを使用して、x への更新によって満たされない項と、満たされない項をすばやく見つけます。(まったく検索するのに O(log n) であり、返される結果ごとに O(1) が加算されます。) 変数を一度に 1 つずつ考慮すると、あまりにも多くのスプリアス ヒットが生成される場合、多次元の一般化がありますが、維持するのにかなりのコストがかかります。

そのような用語がない場合 (たとえば、a <= b)、派生入力 (b - a) を作成し、ハッシュ戦略を使用してそれらを最新の状態に保ちます。

于 2012-04-16T15:47:00.727 に答える
0

一般的な式を因数分解し、グループ化してキャッシュするようにしてください。これにより、特に最も使用されるものを高速化できるため、パフォーマンスが向上する可能性があります。

それがどれほど実現可能かは、ロジックを表現するときに使用する言語によって異なります。計算がデータドライバーであるスプレッドシートとしてプロセスをモデル化できる可能性があります。基本的な評価にはトポロジー的な種類の数式 WRT セル参照で十分ですが、物事はすぐに複雑になります...

C++ では、テンプレート式を使用してロジックを解決しようとすることができます。あなたの言語をモデル化するためのヘルパーはBoost.protoかもしれません

ETALISは Prolog で CEPS を実行します。

私は(まだ)試していませんが(残念ながら)、とても良いと思います。そして、あなたが求めているもの、そしておそらくそれ以上のものを確実に実装します。

SWI-Prolog で実行すると、アクセスしやすく、セットアップと操作が簡単で、SWI-Prolog C++ インターフェイスは実用的なデータ交換に非常に便利です。

于 2012-04-16T02:18:09.483 に答える
0

いくつかの状況では、少数の入力がアクティブなルールの 95% 以上に存在するため、ルールと入力を複数のノードに分散することもうまく機能していないようです。

ルールを配布し、入力をすべてのマシンに供給します。次に、ルールの数を線形にスケーリングできます... LAN 上にいる場合は、イベント/入力をマルチキャストとして送信できるため、ネットワーク トラフィックは増加しません。

于 2012-04-16T15:55:17.957 に答える