3

私は社内の DSP アプリケーション (Groovy/Jython/JRuby 用のフックを備えた Java、OSGi 経由のプラグイン、たくさんの JNI を使用) を、純粋なデータと simulink に似たデータ フロー/ダイアグラム スタイルで開発してきました。私の現在のデザインはプッシュモデルです。ユーザーが何らかのソース コンポーネントとやり取りすると、次のコンポーネントにデータがプッシュされ、終了ブロック (通常はディスプレイまたはファイル ライター) まで続きます。特にコンポーネントが入力不足の場合、この設計にはいくつかの固有の課題があります。さらに入力を要求する簡単な方法はありません。フィードバック制御フローでこれの一部を軽減しました。たとえば、FFT ブロックは、そのチェーンのソース ブロックにより多くのデータが必要であることをブロードキャストできます。プッシュ/プル/両方のコンポーネントのサポートを追加することを検討しました。

プッシュ対プル対両方/ハイブリッドのメリットに関する回答を探しています。以前にこれを行ったことがありますか?「落とし穴」にはどのようなものがありますか? それらをどのように処理しましたか?この問題のより良い解決策はありますか?

4

2 に答える 2

2

大規模な製品での「ほとんどプル」アプローチの経験:

モデル:ノードは1:Nツリーを構築します。つまり、各コンポーネント(ルートを除く)には1つの親と1..Nの子があります。データはほとんど親から子に流れます。変更通知は、ツリー内の任意のノードから発信できます。

実装:すべてのリーフは、送信ノードのIDと「生成」カウンターで通知されます。リーフは、依存しているノードパスを知っているため、更新する必要があるかどうかを知っています。(他の子ノード更新アルゴリズムも同様に機能し、後から考えるとより優れている可能性があります)。

Leafsは親に現在のデータを照会し、照会は再帰的にバブルアップします。生成カウンターが含まれているため、バブルアップは元のノードで停止します。

利点:

  • 親ノードは、子に関する多くの/情報を必要としません。データは誰でも消費できます-これにより、表示を目的としたデータに加えて、いくつかの(当初は予期されていなかった)非UI機能を実装するための一般的なアプローチが可能になりました
  • 子ノードは更新を集約して遅延させることができます(再描画を回避することで、高速ペイントよりも確実に優れています)
  • 非アクティブなリーフは、データトラフィックをまったく発生させません

短所

  • 完全なデータが公開されるため、増分更新にはコストがかかります。実装では、実際にはさまざまなデータパケットを要求できますが(生成カウンターは不要なデータトラフィックを防ぐことができます)、最初に設計されたデータパケットは非常に大きくなります。それらをスライスすることは後付けでしたが、問題なく機能します。
  • 本当に良い生成メカニズムが必要です。最初に実装されたものは、初期更新(特別な処理が必要-「増分更新」を参照)および更新の集約と衝突しました
  • ツリーを上るデータの必要性は大幅に過小評価されていました。
  • 公開は、ノードが現在のデータへの読み取り専用アクセスを提供する場合にのみ安価です。ただし、これには追加の更新同期が必要になる場合があります
  • すべてのリーフが非アクティブな場合でも、中間ノードを更新したい場合があります
  • 一部のリーフはポーリングを実装することになり、一部のベースノードはそれに依存することになりました。ぶさいくな。

一般的:

データプルは、データと処理レイヤーがUIについて何も知らないはずのときに、私にとってよりネイティブな感じがします。ただし、「ユニバースの更新」を回避するには、複雑な変更通知メカニズムが必要です。

データプッシュは増分更新を簡素化しますが、送信者が受信者をよく知っている場合に限ります。

他のモデルを使った同様のスケールの経験がないので、私は本当に推薦することができません。振り返ってみると、私は主にプルを使用していたことがわかりますが、これはそれほど面倒ではありませんでした。他の人々の経験を見るのは興味深いでしょう。

于 2009-06-11T14:01:43.153 に答える
0

純粋な画像処理ライブラリに取り組んでいます。これは、動的入力を処理する必要がないバッチ スタイルの操作により適しているため、非常にうまく機能しているようです。プルは、大規模なデータ セットとスレッド化の場合に特にうまく機能します。少なくとも 32 個の CPU まで直線的にスケーリングします (もちろん、評価されるグラフによって異なります)。

リーフを動的データ ソース (フレームを配信するビデオ カメラなど) にすることができる GUI があり、変更時にグラフの関連部分を破棄して再構築することで処理されます。私たちの場合、これは安価なので、オーバーヘッドはそれほど高くありません。

于 2009-06-11T15:24:01.787 に答える