4

まず、私が構築しているものを説明しましょう。

  • D3.js Force Layout グラフがあり、これは中心に根ざし、その周りに多数のノードが広がっています。中央のノードはある種のエンティティであり、その周りのノードはルートに何らかの形で関連している他のエンティティです。エッジは実際の関係 (つまり、2 つの関係) です。

  • 外側のノードをクリックして、ターゲット エンティティを中央に配置し、その関係をロードできます。

  • このグラフは、ノードをクリックするたびに中心になり、それ自体に直接関係する関係のみが表示されるという意味で「エゴセントリック」です。

私のセットアップ、それが重要な場合に備えて:

  • Node.js を介して API を提供しています。この API は、リクエストを巨大なデータ セットを持つ CouchDB サーバーへのクエリに変換します。

  • レイアウトには D3.js を使用し、jQuery と Bootstrap 以外のクライアント側ライブラリは使用していません。このキャッシュタスクに役立つものがあれば、提案を受け付けています:)

私のアイデア:

  • 毎回グラフのいくつかのレベルを簡単に取得できます (子をリストして展開するプロセスを数回繰り返します)。ルートにロードされたデータ。これは完全な無駄のように思えますが、実際には方向への一歩です。この方法でさらに多くの処理を行うことになります!

  • 取得済みのエンティティのハッシュ テーブルを簡単に維持し、そのエンティティのデータをサーバーに要求する前にリストを確認できます。実装するキャッシュ戦略に関係なく、おそらくこれを行うことになるでしょう。これは、クエリを減らすための非常に簡単な方法だからです。

では、このデータをキャッシュする方法を教えてください。

この種のキャッシングを行うために考えられる非常に効果的な戦略はありますか? サーバー側とクライアント側の両方のオプションは大歓迎です。このプロセスには大量のデータが含まれており、クエリや処理を少しでも減らすことで、私は何マイルも先を行くことができます。

ありがとう!

4

2 に答える 2

2

クライアント側では、ノードを持ち、その子を子の配列にするか、それらの子の約束として機能する関数にします。特定のノードをクリックすると、データがある場合はすぐに表示されます。それ以外の場合は、それを満たす AJAX 要求を送信します。

ノードを (中央に配置せずに) 表示するたびに、表示されたノードの子に対する AJAX 要求の非同期リストを作成し、それらの要求を開始します。そうすれば、ユーザーがクリックしたときに、既にキャッシュされている可能性があります。もしそうでなければ、まあ、あなたは彼らに何の費用もかけませんでした。

作業が完了したら、何レベルの深さに行くのが理にかなっているかを判断します。私の推測では、マジック ナンバーは 1 である可能性が高いと思われます。それを超えると、サーバーの負荷が急速に上昇する一方で、応答性が急速に低下します。しかし、クリックができるだけ早く戻ってくることは、UI にとって非常に大きなメリットです。

于 2012-06-26T22:14:00.653 に答える
1

次の 2 つのことを行う必要があると思います。

  1. リクエストの数を減らす
  2. リクエストのコストを削減

btilly が指摘しているように、表示されているノードごとに関連するノードを要求するのがおそらく最善です。これにより、それらがクリックされた場合にビジュアライゼーションがすぐに応答します。応答の遅れとして、クエリと通過時間は必要ありません。

ただし、リクエストの数を減らす必要がある場合は、総負荷が であるため、リクエスト自体のコストが高すぎることを示唆していますrequestCost * numRequests。要求が完全な DB クエリではなく読み取り要求になるように、各ノードに関連するノードのセットを事前に計算する方法を見つけることを検討してください。難しく聞こえるかもしれませんが、新しいものを検索するたびに Google が行うことです。入力を開始するたびにインターネットを検索することはできないため、事前に検索してキャッシュします。

これは、ある程度の非正規化を意味する場合があります。キャッシュクエリがある場合、それらが同期しているという保証はありませんが、問題はデータセットが変更されるかどうかです。それは一度書いて、たくさん読んでいますか?

これらすべてのノードとそれらの関係に必要なスペースを最小限に抑えるには、これを粒子の相互作用の問題として考えてください。スペースを分割することにより、ノードをグループ化して、ノードのグループにその集約された隣接ノードを照会し、それを保存するだけでよいようにすることができます。そうすれば、完全な DB クエリではなく、各リクエストに対してはるかに小さなフィルタリングを行うことができます。O(n log n) で、na を 100 分の 1 にすると、100 倍以上高速になります。

于 2012-11-06T15:53:19.123 に答える