1

私はノードのネットワークを持っており、各ノードは他のいくつかのノードの状態に影響を与えています(数式を介して他のセルに依存するセル値を持つExcelスプレッドシートを想像してください)。

Rubyでこれを実装する最もクリーンな方法は何ですか?

もちろん、ノードごとに1つのプロセスを持つこともできますが、ノードの数が増えるとどのように実行されますか?そして、そのためのライブラリがあると確信していますが、最新のものを見つけることができません。

ご協力いただきありがとうございます !

更新:EventMachineがその仕事をするように聞こえます...しかし、それは少数の「ノード」により適応しているようです

4

3 に答える 3

3

これはオブザーバー パターンにとっては良い状況のように思えます。これはルビーでのサンプルです:

require 'observer'

class Node
  attr_accessor :id
  @@current_node_id = 0
  def initialize
    @@current_node_id += 1
    id = @@current_node_id
  end
  include Observable

  attr_reader :value


  protected
  def value=(new_value)
    return if @value == new_value
    old_value = @value
    @value = new_value
    changed
    notify_observers(id, old_value, @value)
  end
end


class ValueNode < Node
  def initialize(initial_value)
    super()
    @value = initial_value
  end

  def value=(new_value)
    super(new_value)
  end
end


class SumNode < Node
  def initialize(*nodes)
    super()
    @value = nodes.map(&:value).inject(0, &:+)
    nodes.each do |node|
      node.add_observer(self)
    end
  end


  def update(id, old_value, new_value)
    self.value = self.value - old_value + new_value
  end
end


def test
  v1 = ValueNode.new 4
  v2 = ValueNode.new 8
  sum = SumNode.new(v1, v2)
  sum2 = SumNode.new(v1, sum)
  v2.value = 10
  p sum.value
  p sum2.value
end


test()

SumNodeの値が要求されるたびに再計算されるのではなく、その値ノードの 1 つが更新されると更新されることに注意してください。これは再帰的に機能するため、内部SumNodesも更新をトリガーします。通知にはノードの一意が含まれているため、式を含むものなど、idより複雑な型を記述することができます。Node

Observable の詳細については、http: //www.ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html を参照してください。

于 2011-06-29T12:06:10.393 に答える
1

これはよく使われる Twitter パラダイムに似ています。つまり、1 人のユーザーによる更新がすべてのフォロワーにプッシュされます。これを効率的に行うには、特定の人について 2 つのリストを保存する必要があります。ノードのリストについても同じことができます。ノードが変更されると、このノードの影響を受けるノードをすばやく検索できます。関係が消えると、どのリストから逆の関係を「削除」するかを知るために「前方」リストが必要になります。

これらのリストは 2 次元配列、または Redis などに保存できます。EventMachine がどのように適合するかはよくわかりません。

于 2011-06-29T12:09:47.013 に答える
0

依存関係のネットワーク グラフがあり、それらをスケーリングしたい場合は、グラフ データベースが最適なソリューションです。Neo4Jは、この種の依存関係を追跡するための人気のある強力なデータベースです。

Ruby から Neo4J に接続するには、いくつかの方法があります。

于 2011-06-29T12:31:56.453 に答える