2

ルーティングの目的で Java サーブレットで処理される大きなグラフがあります。グラフには 10 万以上のノードがあるため、新しい呼び出しごとに再読み込みすることはできません。現時点では、グラフはデータベースから RAM に一度ロードされ、ハッシュマップで参照されます。

サーブレットを開始する (新しいインスタンスを作成する) とき、ID でグラフ内の startnode を見つける必要があります。したがって、ハッシュマップを使用します。

それはすべて非常にうまく機能します。

私の問題は、ルーティングタスク内で、グラフ内の特定の属性、つまり移動距離を変更する必要があることです。もちろん、これらの属性は、作成されたインスタンスごとに個別である必要があります。現時点では、新しいインスタンスを作成するときにすべての「非静的」属性をリセットすることで、そのタスクを処理しています。これにより、2 つの問題が生じます。

A) インスタンスはスレッドセーフではありません

B) リセットには非常に時間がかかります。実際のルーティングの最大 10 倍。

したがって、必要なのは、サーブレットのすべてのインスタンスの静的ハッシュマップです。このハッシュマップには、ネットワークのすべてのノードを含める必要があります。これらのノードには、id、座標、隣接ノードなどの静的属性だけでなく、移動距離などの非静的属性も必要です。

どうやってやるの?

読んでアイデアを共有してくれてありがとう

4

2 に答える 2

1

問題は、実行時に構築され、サービスの実行ごとにインスタンス化されるモデルとして説明できます。

あなたが「静的」と言うとき、私はあなたが「一定」を意味すると思います。変数属性は、各サーブレットインスタンスではなく、実際には各実行に固有です。実行中に、定数属性に対応する変数属性を使用して別の構造を構築する必要があります。可変構造の各ノードは、定数構造の単一のノードを参照します。可変構造は、各ノードの必要性が発生するにつれて、段階的かつオンデマンドで構築されます。構造は実行の最後に破棄されます。

于 2012-11-10T09:25:37.773 に答える
0

Marko Topolnikがアドバイスしたように、シングルトンの方法で「メイングラフ」をRAMに保持することをお勧めしますが、階層なしで、各セッションごとに変更されたノードのみのマップを保持し、IDごとに保存するだけです(適用可能、それ自体)

  • セッションが終了したら、セッション内のマップを破棄するだけで済みます。それだけです。
  • 新しいセッションが開始したら、新しい Map インスタンスを作成するだけです...
  • それが重要な場合は、これらのマップをプールすることもできますが、回避するよりもはるかに多くの問題を引き起こすため、時期尚早の最適化は避けてください。
  • ノードにアクセスする必要がある場合は、元のマップからフェッチし、「セッション ローカル」マップに存在する場合は検索し、見つかった場合は 2 つのデータをマージします。(または、「セッションローカル」マップに変更された属性だけでなく、完全なノードを保存する場合は、そのマップから変更されたノードを使用します)
  • また、注意してください。これには、メモリリークを引き起こす可能性のある多くの場所があります...
于 2012-11-10T09:37:41.480 に答える