5.11 ロード・オンデマンドを使用したネットワーク分析

ロード・オンデマンドとは、ネットワーク分析時に、調査がネットワーク・パーティションに到達するまでは、そのパーティションがメモリーにロードされないことです。

ロード・オンデマンドを使用すると、Oracle Spatialでは、ほとんどのパーティション化とロードの操作が自動的に実行され、これにより、通常は大規模なネットワークでのメモリーの使用効率を高めることができます。

ロード・オンデマンド分析には、次に説明する主要ステップ(ネットワークの作成、ネットワークのパーティション、パーティション・キャッシュの構成およびネットワーク分析)が含まれます。

  1. 「ネットワーク・データ・モデルを使用するための主なステップ」で説明する方法のうち1つを使用してネットワークを作成します。

  2. SDO_NET.SPATIAL_PARTITIONプロシージャを使用してネットワークをパーティション化します(「ネットワークのパーティション化」を参照)。

  3. オプションで、パーティションBLOBを生成します(「パーティションBLOBの生成」を参照)。

  4. パーティション・キャッシュを含むロード・オンデマンド環境を構成します(「パーティション・キャッシュの構成」を参照)。

  5. ネットワークを分析します(「ネットワークの分析」を参照)。

ノート:

また、ロード・オンデマンド分析は、ネットワーク全体を1つのパーティションとして扱うことによって、パーティション化されていないネットワークでも使用できます。小規模なネットワークでは、ネットワークをパーティション化してもメリットが得られない場合があるため、そのようなケースについてはパーティション化を省略してロード・オンデマンドAPIを使用することができます。

ロード・オンデマンドのネットワーク分析の実行とパーティション・キャッシュの構成の例については、「パーティション化とロード・オンデマンド分析の例(PL/SQL、XMLおよびJava)」を参照してください。

パーティション化とロード・オンデマンド分析のその他の例については、Oracle Database Examplesメディアに含まれています(『Oracle Database Examplesインストレーション・ガイド』を参照)。ネットワーク・データ・モデルの例とデモ・ファイルの詳細は、「ネットワーク・データ・モデルのチュートリアルとその他のリソース」を参照してください。

5.11.1 ネットワークのパーティション化

ネットワークをパーティション化するには、SDO_NET.SPATIAL_PARTITIONプロシージャを使用して、各パーティション内のノードの最大数を指定します。パーティション結果は、自動的に生成されるパーティション表に格納され、パーティション・メタデータ情報がネットワーク・メタデータに挿入されます。(このプロシージャを使用するかわりに、パーティション表を作成および移入することによってネットワークをパーティション化することもできます。)他のSDO_NETサブプログラムを使用してパーティション・メタデータを問い合せることもできます。

パーティション化の方法としては、パーティション間のリンク数を最小限に抑える方法をお薦めします。この方法により、ロードする必要のあるパーティションの数および同じパーティションをリロードする必要がある推定回数を減らします。また、パーティションのサイズが小さすぎると、分析中のパーティションのロードおよびアンロードが多くなります。

メモリーを1GBと想定した場合に推奨されるパーティション当たりのノードの最大数は、5,000から10,000の間です。この数を調整して使用中のアプリケーションに最適な数であることを確認するには、使用可能なメモリー、分析のタイプおよびネットワークのサイズを考慮します。また、パーティション・キャッシュのサイズの構成も考慮する必要があります。

5.11.2 パーティションBLOBの生成

ネットワークのロードのパフォーマンスを向上させるために、オプションで、ネットワーク・パーティションBLOB表にBLOBとしてパーティションを格納できます。パーティションのロード時間の短縮というメリットを得るには、この情報をネットワーク・メタデータ・ビューに格納する必要があります。ネットワークまたはパーティションの情報が更新されると、パーティションBLOBも再生成する必要があることに注意してください。

パーティションBLOBは、ノード数、リンク数、各ノードのプロパティ、各リンクのプロパティなどのネットワーク・パーティション情報を含むデータのバイナリ・ストリームです。パーティションBLOBが存在する場合、Spatialでは、時間のかかるデータベース問合せを実行せずに、このBLOBを使用してロード操作中に情報を読み取ります。

パーティションBLOBを生成するには、SDO_NET.GENERATE_PARTITION_BLOBSプロシージャを使用します。パーティションBLOBとそのメタデータは、パーティションBLOB表に格納されます。

5.11.3 パーティション・キャッシュの構成

ネットワーク分析を実行する前に、XML構成ファイルを変更してデフォルトの構成をオーバーライドすることにより、パフォーマンスが最適化されるようにネットワーク・パーティション・キャッシュを構成できます。次のものを指定できます。

  • キャッシュ・サイズ: パーティション・キャッシュ内のノードの最大数。

  • パーティション・ソース: ネットワーク表またはパーティションBLOB。

  • 常駐パーティション: キャッシュからフラッシュされることなく、一度ロードされるとメモリー内に保持されるパーティションのID。

  • キャッシュのフラッシュ方針: CachingHandlerの実装のクラス名。

    デフォルトのキャッシュ方針はLeastRecentlyUsedです。この方針では、キャッシュが一杯になると、メモリーから最も古いパーティションがフラッシュされます。他のキャッシュ方針を指定するには、CachingHandlerインタフェースを実装します。

デフォルトのロード・オンデマンド構成ファイルのコピーは補足のドキュメントに含まれています(「ネットワーク・データ・モデルのチュートリアルとその他のリソース」を参照)。

5.11.4 ネットワークの分析

ネットワークの作成およびパーティション化を行い、オプションでパーティション・キャッシュを構成した後は、分析問合せを発行できます。分析結果は、JavaまたはXML APIのいずれを使用したかによって、Java表現またはXMLの応答で戻されます。詳細は、ロード・オンデマンド(LOD)のJavadocおよびXMLスキーマを参照してください(後者については「ネットワーク・データ・モデルのチュートリアルとその他のリソース」を参照)。

ロード・オンデマンドのJava APIを使用して分析結果をデータベースに書き込むこともできます。

5.11.5 リンク・レベルを使用した優先順位のモデリング

ロード・オンデマンド方式を使用すると、大規模なネットワークを分析する場合のメモリー制限の影響は小さくなりますが、分析操作の速度が非常に遅いままであることがあります。たとえば、ネットワーク全体を斜めに横切る2つのノードの最短パスの分析では、ネットワーク内のほとんどすべてのリンクを走査することになる可能性があります。そのため、ネットワークに200万個を超えるノードがある場合などは、非常に長い時間がかかります。

ネットワークの分析にかかる時間をさらに短縮するには、異なるリンク・レベルで分析を実行します。リンク・レベルとは、リンクの優先順位のレベルを示す、リンクに割り当てられた正の整数のことです。リンク・レベルが高いほど、優先順位が高くなります。たとえば、道路ネットワークの場合は、2つのリンク・レベル(一般道路に対してはレベル1、高速道路に対してはレベル2)で構成することができます。ネットワーク分析中は、高速道路が一般道路より優先され、最低リンク・レベルが1になります。(リンク・レベルが割り当てられていないリンクには、デフォルトのリンク・レベル1が使用されます。)

リンク・レベルには暗黙的な継承プロパティが含まれています。これは、リンク・レベルの高いネットワークが、リンク・レベルの低いネットワークのサブネットワークとなる必要があるということです。つまり、リンク・レベル2はリンク・レベル1のサブネットワークで、リンク・レベル3はリンク・レベル2のサブネットワークなどのように設定されます。

リンク・レベルはネットワークまたはパーティションのロード時に指定できます。これにより、そのレベルと、そのレベルより高いレベルのリンクがロードされます。一般道路に対してレベル1、および高速道路に対してレベル2が割り当てられている道路ネットワークの例では、ロード操作でリンク・レベル1を指定するとレベルが1および2のリンク(つまり一般道路と高速道路)がロードされますが、ロード操作でリンク・レベル2を指定すると、高速道路のリンクのみがロードされます。高速道路のリンクのみを使用して分析を実行する場合は、ロード操作に対してリンク・レベル2を指定してパフォーマンスを最適化できます。

5.11.6 計算済の分析結果

接続されているコンポーネントの分析などの一部の分析操作には、時間がかかる場合があります。実行時のパフォーマンスを向上させるには、SDO_NET.FIND_CONNECTED_COMPONENTSプロシージャをコールし、このプロシージャにより、ネットワーク内の接続されているコンポーネントを計算して、接続されているコンポーネント表にその結果を格納します。

実行時には、最短パスの分析または到達可能性の分析をコールする前に、接続されているコンポーネント表を問い合せて、対象ノードが同じ接続されているコンポーネントに属しているかどうかを確認できます。計算済のコンポーネント情報が存在しない場合は、最短パスおよび到達可能性の分析で、2つのノードが実際には接続されていないことを検出するまでに長い時間がかかる場合があります。