(57)【特許請求の範囲】
【請求項１】
複数のコンピュータが疎結合された分散メモリ型のマルチプロセッサシステムに適用される分散共有メモリシステムにおいて、
前記複数のコンピュータそれぞれで動作するプロセスすべてに対して同一アドレスで共通にアクセス可能な共有メモリ空間を提供する共有メモリ空間提供手段と、
前記プロセスが入力データから抽出する特定のアイテムの集合ごとの出現頻度を保持するデータ構造体を前記共有メモリ空間内に作成するデータ構造体作成手段と、
前記データ構造体に保持された出現頻度に対する前記プロセスの数え上げの履歴を取得する数え上げ履歴取得手段と、
前記数え上げ履歴取得手段により取得された数え上げ履歴を他のコンピュータに転送する数え上げ履歴転送手段と、
他のコンピュータから転送される数え上げ履歴を受信する数え上げ履歴受信手段と、
前記数え上げ履歴受信手段により受信された数え上げ履歴を前記データ構造体に保持された出現頻度に反映させる数え上げ履歴反映手段とを具備したことを特徴とする分散共有メモリシステム。
【請求項２】
前記数え上げ履歴取得手段は、数え上げられた出現頻度が保持される前記データ構造体上のアドレスを取得することを特徴とする請求項１記載の分散共有メモリシステム。
【請求項３】
前記数え上げ履歴取得手段は、数え上げられた出現頻度が保持される前記データ構造体上のアドレスおよびその数量を取得することを特徴とする請求項１記載の分散共有メモリシステム。
【請求項４】
前記データ構造体作成手段は、前記複数のコンピュータの中のいずれか一つのコンピュータで前記データ構造体を作成し、その作成したデータ構造体をその他のコンピュータに複写することを特徴とする請求項１、２または３記載の分散共有メモリシステム。
【請求項５】
前記データ構造体作成手段は、前記データ構造体を前記複数のコンピュータそれぞれで並行して作成することを特徴とする請求項１、２または３記載の分散共有メモリシステム。
【請求項６】
複数のコンピュータが疎結合された分散メモリ型のマルチプロセッサシステムに適用される分散共有メモリの制御方法において、
前記複数のコンピュータそれぞれで動作するプロセスすべてに対して同一アドレスで共通にアクセス可能な共有メモリ空間を提供するステップと、
前記プロセスが入力データから抽出する特定のアイテムの集合ごとの出現頻度を保持するデータ構造体を前記共有メモリ空間内に作成するステップと、
前記データ構造体に保持された出現頻度に対する前記プロセスの数え上げの履歴を取得するステップと、
前記取得した数え上げ履歴を他のコンピュータに転送するステップと、
他のコンピュータから転送される数え上げ履歴を受信するステップと、
前記受信された数え上げ履歴を前記データ構造体に保持された出現頻度に反映させるステップとを具備したことを特徴とする分散共有メモリの制御方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、たとえばＴＢ（テラバイト）オーダーなどの大規模データマイニングを実行する分散メモリ型のマルチプロセッサシステムに適用して好適な分散共有メモリシステムおよび分散共有メモリの制御方法に関する。
【０００２】
【従来の技術】
近年、バーコード技術の発展などによって、スーパーマーケットなどの小売業者は、大量の売上データを蓄積するようになった。また、先進的な小売業者にあっては、この蓄積された大量の売上データを解析し、ストアレイアウトなどに反映させることにより、その売上を高めるに至っている。このような技術は、一般にデータマイニングと呼ばれている。
【０００３】
このデータマイニングで求める情報にはいくつかあるが、最も代表的な情報として、アソシエイションルールというものが存在する。アソシエイションルールとは、たとえば、「紙オムツを買うお客の５０％は、一緒に缶ビールも買っていく」というものである。これは、アメリカのスーパーマーケットにおける例であり、アメリカでは、若い父親が紙オムツを買いに来ることが多いため、紙オムツと一緒に缶ビールを買っていくことが多いということを示している。そこで、こういった情報を生かし、たとえば紙オムツと缶ビールとを近くに置くことによって、缶ビールの売上を高めるという訳である。このアソシエイションルールの求め方は、R. Agrawal et al.,  “Mining Association Rules between Sets of Items in Large Databases ”, Proceedings of ACM SIGMOD, May 1993 に示されている。これを以下に簡単に示す。
【０００４】
属性の集合（アイテム）をＩ＝｛ｉ１，ｉ２，…，ｉｍ｝、トランザクションデータベースをＤ＝｛ｔ１，ｔ２，…，ｔｎ｝とする。なお、ここで、ｔｉは、アイテムの集合からなる。アソシエイションルールをＸ＝＞Ｙと定義する。ここで、Ｘ、ＹはＩの部分集合であり、ＸとＹとの共通集合は空集合である。ここでサポート値とコンフィデンス値という２つの評価値を定義する。サポート値は、ＤがＸを含む割合を示し、コンフィデンス値は、Ｄの中でＸを含むトランザクションのうち、ＸとＹを共に含むトランザクションの割合を示す。アソシエイションルールの抽出は以下の手順による。
（１）．最小サポート値を満足するアイテム集合を見つけ出す（これを頻出アイテム集合と呼ぶ）。
（２）．（１）で求めた頻出アイテム集合から最小コンフィデンス値を満足するアソシエイションルールを見つけ出す。
以下にアソシエイションルールの抽出例を示す。トランザクションとして、Ｔ１＝｛１，３，４｝、Ｔ２＝｛１，２，３，５｝、Ｔ３＝｛２，４｝、Ｔ４＝｛１，２｝、Ｔ５＝｛１，３，５｝があるとする。そして、このトランザクションの中から最小サポート値６０％、最小コンフィデンス値６０％で、アソシエイションルールを見つけ出す。すると、頻出アイテム集合は、｛１｝、｛２｝、｛３｝、｛１、３｝で、アソシエイションルールとしては、１＝＞３が見つかる。
【０００５】
また、この頻出アイテム集合の抽出を効率的に処理する手法として、Apriori のアルゴリズムが知られている。このApriori のアルゴリズムは、R. Agrawal et  al., “Fast Algorithms for Mining Association Rules”, Proceedings of 20th VLDB, 1994に示されている。これを以下に簡単に示す。
（１）．トランザクションデータベースを読み、各アイテムの生起回数を数え上げてサポート値を求める。なお、ここで、アイテムの生起回数の数え上げとは、トランザクションデータベースに各アイテムが各々何回出現したかを数えることを示す。以降、「数え上げ」とは、このことを意味するものとする。
（２）．最小サポート値を満足するものを取り出し、長さ１の頻出アイテム集合とする。
（３）．長さ１の頻出アイテム集合から２つのアイテムの組み合わせを作る。これらを長さ２の候補アイテム集合と呼ぶ。
（４）．トランザクションデータベースを検索してサポート値を求める。
（５）．最小サポート値を満足するものを取り出し、長さ２の頻出アイテム集合とする。
（６）．以降、長さｋ（＞＝２）の場合の処理は、以下の通りとなる。
（ａ）．長さｋ−１の頻出アイテム集合から長さｋの候補アイテム集合を作る。
（ｂ）．トランザクションデータベースを検索してサポート値を求める。
（ｃ）．最小サポート値を満足するものを取り出し、長さｋの頻出アイテム集合とする。
（７）．前述の処理を頻出アイテム集合が空になるまで繰り返す。
このように、従来のデータマイニングにおいては、アソシエイションルールを見つけ出すために、基本的にはこのApriori のアルゴリズムを利用していた。
【０００６】
【発明が解決しようとする課題】
ところで、このApriori のアルゴリズムは効率的なものであるが、データマイニングで処理するトランザクションデータは、ＴＢオーダーにも及ぶため、大規模なトランザクションデータは処理することができない。あるいは、たとえ処理することができたとしても、膨大な処理時間がかかってしまうといった問題があった。たとえば、１ＴＢのトランザクションデータは、２ＧＢ（ギガバイト）のディスク装置で５００台にもなるため、ＳＭＰ計算機を利用したとしても、５００台すべてのディスクを１台の計算機に接続するのは困難てあるし、仮に５００台すべてのディスク装置を接続できたとしても、Ｉ／Ｏの性能上問題がある。そのため、ＴＢオーダーのトランザクションデータが格納されたディスク装置は、クラスタシステムを用いて複数ノードに分散して処理するのが好ましい。ところが、このApriori アルゴリズムは逐次処理のアルゴリズムであるために、分散メモリ型のクラスタシステム上では動作しない。また、分散メモリ型のクラスタシステムでも動くように、このApriori アルゴリズムを改良したとしても、それは通信を伴なう分散メモリ型のプログラミングモデルにならざるを得ないため、データマイニングのプログラム開発が困難になってしまうといった問題があった。
この発明は、このような実情に鑑みてなされたものであり、たとえばＴＢ（テラバイト）オーダーなどの大規模データマイニングを効率的に処理することのできる分散共有メモリシステムおよび分散共有メモリの制御方法を提供することを目的とする。
【０００７】
【課題を解決するための手段】
この発明は、複数のコンピュータが疎結合された分散メモリ型のマルチプロセッサシステムに適用される分散共有メモリシステムにおいて、前記複数のコンピュータそれぞれで動作するプロセスすべてに対して同一アドレスで共通にアクセス可能な共有メモリ空間を提供する共有メモリ空間提供手段と、前記プロセスが入力データから抽出する特定のアイテムの集合ごとの出現頻度を保持するデータ構造体を前記共有メモリ空間内に作成するデータ構造体作成手段と、前記データ構造体に保持された出現頻度に対する前記プロセスの数え上げの履歴を取得する数え上げ履歴取得手段と、前記数え上げ履歴取得手段により取得された数え上げ履歴を他のコンピュータに転送する数え上げ履歴転送手段と、他のコンピュータから転送される数え上げ履歴を受信する数え上げ履歴受信手段と、前記数え上げ履歴受信手段により受信された数え上げ履歴を前記データ構造体に保持された出現頻度に反映させる数え上げ履歴反映手段とを具備することを特徴とする。
【０００８】
また、この発明は、複数のコンピュータが疎結合された分散メモリ型のマルチプロセッサシステムに適用される分散共有メモリの制御方法において、前記複数のコンピュータそれぞれで動作するプロセスすべてに対して同一アドレスで共通にアクセス可能な共有メモリ空間を提供するステップと、前記プロセスが入力データから抽出する特定のアイテムの集合ごとの出現頻度を保持するデータ構造体を前記共有メモリ空間内に作成するステップと、前記データ構造体に保持された出現頻度に対する前記プロセスの数え上げの履歴を取得するステップと、前記取得した数え上げ履歴を他のコンピュータに転送するステップと、他のコンピュータから転送される数え上げ履歴を受信するステップと、前記受信された数え上げ履歴を前記データ構造体に保持された出現頻度に反映させるステップとを具備したことを特徴とする。
【０００９】
この発明においては、たとえばApriori のアルゴリズムに基づいたデータマイニングの処理を、共有メモリをもたない分散メモリ型のマルチプロセッサシステムで並列に処理させることにより、たとえばＴＢオーダーのトランザクションを高速に処理することを可能とする。
【００１０】
また、分散共有メモリを提供することにより、分散メモリ型のマルチプロセッサシステムであるにも関わらず、通信を伴なう分散メモリ型のプログラミングモデルを不要とするため、逐次処理から自然な拡張である共有メモリモデルでのプログラム開発を可能とする。すなわち、様々な変形をもつアソシエイションルールを見つけ出すデータマイニングのプログラム開発を容易化することを可能とする。
【００１１】
【発明の実施の形態】
以下、図面を参照してこの発明の実施の形態を説明する。
図１は、この発明の実施形態に係る分散メモリ型マルチプロセッサシステムの概略構成およびこの分散メモリ型マルチプロセッサシステムに適用される分散共有メモリシステムの機能ブロックを示す図である。
【００１２】
ノード１００は、各々１個以上のプロセッサ、メモリおよびＩ／Ｏ装置を備えてなり、また、これらのノード１００は、ネットワーク２００を介して互いに接続されている。
【００１３】
これら各ノード１００上では、プロセス１１が動作し、各プロセス１１のアドレス空間内には、すべてのプロセス１００から共通に（同じアドレスに）見える共有メモリ空間１２が存在する。この共有メモリ空間１２は、共有メモリ空間提供部１３によって提供される。
【００１４】
この共有メモリ空間１２内には、共有メモリ空間内データ構造作成部１４によってハッシュ構造のハッシュテーブル１６が作成され、アイテムの種類と出現頻度とからなる統計情報１５が格納される。このハッシュテーブル１６は、いずれか１つのノード１００で作成し、他のノード１００にコピーするか、あるいはすべてのノード１００で並行して作成する。なお、ここで、アイテムとは、たとえばスーパーマーケットのＰＯＳデータでいえば、紙オムツや缶ビールなどの商品項目を示す。
【００１５】
この統計情報１５は、プロセス１１がトランザクションデータ１７を読み込んだ際に、プロセス１１のアイテム出現頻度数え上げ部１８によってそのアイテムの出現頻度が数え上げられていく。なお、ここでいうトランザクションデータとは、たとえばスーパーマーケットのＰＯＳデータでいえば、紙オムツや缶ビールなどの一回の買い物レシートを示す。
【００１６】
図１では、各ノードにディスク装置が１個しか存在せず、そこにすべてのトランザクションデータ１７が格納されている様に示されているが、実際には、各ノード１００に多数のディスク装置が存在し、トランザクションデータ１７を分割して保持している。たとえば、１ＴＢのトランザクションデータは、２ＧＢのディスク装置で５００台を要するため、たとえば１０ノードのシステムであれば各ノードに５０台のディスク装置が接続されることになる。そして、１ＴＢのトランザクションデータは、１０ノード５００台のディスク装置に分割して格納されることになる。
【００１７】
また、プロセス１１のアイテム出現頻度数え上げ部１８がアイテムの出現頻度を数え上げる際、同時に、プロセス１１の数え上げログ記録部１９が、この数え上げの履歴である数え上げログ２０を記録していく。そして、この記録された数え上げログ２０は、数え上げログ転送部２１によって、他のノード１００に転送される。
【００１８】
この転送された数え上げログ２０は、各々のノード１００で、数え上げログ受信部２２によって受信され、数え上げログ反映部２３によって、それぞれのノード１００の共有メモリ空間１２に反映される。
【００１９】
ここでいう「数え上げ」とは、たとえば、トランザクションデータ１７を読み出し、そこに含まれるアイテムの出現頻度をインクリメントすることである。よって、「数え上げログ」とは、アイテムの出現頻度を記録するための領域のアドレスとなる。このアイテムの出現頻度を記録するための領域は、共有メモリ空間１２上に確保されているので、どのノード１００上のプロセス１１からも同じアドレスでアクセスできる。それゆえに、数え上げログ２０としてアイテムの出現頻度を記録するための領域のアドレスを送れば、それを受信したノード１００では、そのアドレスで示された領域の値をインクリメントすることによって、他のノード１００で行なわれた数え上げを自身のノード１００に反映することができるため、ノード１００間で共通に見える共有メモリ空間１２上のデータの一貫性を保持することが可能となる。
【００２０】
図２は、トランザクションデータ１７の例を示す図である。図２中、１つ目のトランザクションデータ１７は、ａ、ｂおよびｃの３つのアイテムを含んでおり、また、２つ目のトランザクションデータ１７は、ａ、ｂ、ｄ、ｅおよびｘの５つのアイテムを含んでいる。そして、このａやｂといったアイテムが、スーパーマーケットのＰＯＳデータでいう紙オムツや缶ビールなどに相当する。
【００２１】
図３は、頻出アイテム集合の抽出を効率的に処理する手法であるApriori のアルゴリズムを実行するプログラムの処理の流れを示すフローチャートである。
まず、長さ１の候補アイテム集合を作る（ステップＡ１）。なお、ここで、長さ１のアイテム集合とは、｛ａ｝や｛ｂ｝のような１個の要素だけからなるアイテムの集合を示す。次に、トランザクションデータ１７を読み出し、各アイテムの出現頻度を数え上げ、サポート値を求める（ステップＡ２）。そして、最小サポート値を満足するアイテムを取り出し、長さ１の頻出アイテム集合を作る（ステップＡ３）。
【００２２】
次に、長さ１の頻出アイテム集合から、２つのアイテムの組み合せを作る（ステップＡ４）。これを長さ２の候補アイテム集合とする。すなわち、長さ２のアイテム集合とは、｛ａ，ｂ｝や｛ａ，ｃ｝のような２個の要素からなるアイテムの集合を示す。そして、トランザクションデータ１７を読み出し、各アイテムの出現頻度を数え上げ、サポート値を求め（ステップＡ５）、最小サポート値を満足するアイテムを取り出し、長さ２の頻出アイテム集合を作る（ステップＡ６）。
【００２３】
ここで、長さｋ（＞＝２）の頻出アイテム集合が空かどうか検査し（ステップＡ７）、もし空ならば（ステップＡ７のＹＥＳ）、処理を終了する。一方、空でなければ（ステップＡ７のＮＯ）、ｋに１を加え（ステップＡ８）、長さｋ−１の頻出アイテム集合から、長さｋの候補アイテム集合を作る（ステップＡ９）。そして、トランザクションデータ１７を読み出し、各アイテムの出現頻度を数え上げ、サポート値を求め（ステップＡ１０）、最小サポート値を満足するアイテムを取り出し、長さｋの頻出アイテム集合を作った後（ステップＡ１１）、ステップＡ７から前述の処理を繰り返す。
【００２４】
図４は、図３に示した頻出アイテム集合の抽出処理において数え上げが行なわれるパス１、すなわち長さ１のアイテムの種類と出現頻度とからなる統計情報１５を管理するハッシュテーブル１６を示すものである。図４における｛ａ｝、｛ｂ｝および｛ｃ｝などは、アイテムの種類を示しており、その後の空白部分は、そのアイテムの出現頻度を数え上げるための領域を示している。
【００２５】
また、図５は、図３に示した頻出アイテム集合の抽出処理において数え上げが行なわれるパス２、すなわち長さ２のアイテムの種類と出現頻度とからなる統計情報１５を管理するハッシュテーブル１６を示すものである。図５における｛ａ，ｂ｝、｛ａ，ｃ｝および｛ａ，ｄ｝などは、２要素からなるアイテムの種類を示しており、その後の空白部分は、そのアイテムの出現頻度を数え上げるための領域を示している。
【００２６】
この実施形態に係る分散共有メモリシステムでは、図３に示したApriori アルゴリズムを実行するプログラムの処理の流れのうち、ステップＡ１〜ステップＡ２、ステップＡ４〜ステップＡ５およびステップＡ９〜ステップＡ１０を複数のノード１００上で並列に実行することを可能にするものである。そして、この実施形態の分散共有メモリシステムにおける複数ノード１００による数え上げの並列処理の流れを示すフローチャートが図６である。
【００２７】
まず、いずれかのノード１００で動作する１つのプロセス１１が、共有メモリ空間１２内に、アイテムの種類と出現頻度とからなる統計情報１５を管理するハッシュテーブル１６を共有メモリ空間内データ構造作成部１４によって作成し、作成が終わったら、他のすべてのノード１００の共有メモリ空間１２にそのハッシュテーブル１６をコピーする（ステップＢ１）。この間、他のプロセス１１は、この処理が終わるのを待機する。これにより、ステップＢ１の終了時点では、すべてのノード１００のすべてのプロセス１１の共有メモリ空間１１内で同じハッシュテーブル１６が参照できるようになる。
【００２８】
その後、各プロセス１１は、各ノード１００のトランザクションデータ１７を読み出し、ハッシュテーブル１６で管理されたアイテムの出現頻度数え上げをアイテム出現頻度の数え上げ部１８により行なう（ステップＢ２）。そして、数え上げを行なう際に、数え上げログ記録部１９により数え上げログを記録する（ステップＢ３）。
【００２９】
一方、数え上げログ転送部２１は、この記録された数え上げログを他のノードに転送する（ステップＢ４）。他のノード１００に転送された数え上げログは、数え上げログ受信部２２によって受信され、数え上げログ反映部２３によってそれぞれのハッシュテーブル１６で管理されたアイテムの出現頻度に反映される。
【００３０】
ステップＢ２に示した様に、各ノード１００の各プロセス１１は、各々のノード１００のトランザクションデータ１７を独立に読み出し、数え上げを行なっていく。しかしながら、ステップＢ３に示した様に、あるノード１００で行なわれた数え上げは、数え上げログを他ノードに転送することにより、すべてのノード１００のハッシュテーブル１６に反映されることになる。したがって、ステップＢ４の後、すべてのプロセス１１による数え上げとその結果の他のノード１００への反映が終わるのを待機する（ステップＢ５）。
【００３１】
なお、図７は、数え上げログ２０の構造を示すものであり、数え上げが行なわれたアイテムの出現頻度をカウントする領域のアドレスを、数え上げが行なわれる度に記録している。この数え上げログ２０を他のノード１００に転送し、他ノード１００でそれを反映することにより、各ノード１００の共有メモリ空間１２の一貫性を保持することができる。この出現頻度をカウントする領域は、共有メモリ空間１２上に位置しているので、どのノード１００でも同じアドレスにあることになる。したがって、数え上げログ２０は、このようなアドレス情報でよくなっている。
【００３２】
一方、図８は、数量も扱ってアソシエイションルールを求める場合のトランザクションデータ１７の構造を示している。１個目のデータは、３個のａ、１個のｂ、２個のｃを含んでいる。たとえばＰＯＳデータでいえば、３パックの牛乳、１斤の食パンおよび２パックの卵などを示すものである。
【００３３】
そして、図９は、数量も扱ってアソシエイションルールを求める場合の数え上げログ２０の構造を示す図であり、数え上げが行なわれたアイテムの出現頻度をカウントするアドレスを数量と共に記録している。
【００３４】
このように、この実施形態の分散共有メモリシステムによれば、共有メモリをもたない分散メモリ型のマルチプロセッサシステムにおいても、たとえばＴＢオーダーのデータを処理する大規模データマイニングを効率的に実行することが可能となる。
【００３５】
【発明の効果】
以上詳述したように、この発明によれは、たとえばApriori のアルゴリズムに基づいたデータマイニングの処理を、共有メモリをもたない分散メモリ型のマルチプロセッサシステムで並列に処理させることにより、たとえばＴＢオーダーのトランザクションを高速に処理することを可能とする。
【００３６】
また、分散共有メモリを提供することにより、分散メモリ型のマルチプロセッサシステムであるにも関わらず、通信を伴なう分散メモリ型のプログラミングモデルを不要とするため、逐次処理から自然な拡張である共有メモリモデルでのプログラム開発を可能とする。すなわち、様々な変形をもつアソシエイションルールを見つけ出すデータマイニングのプログラム開発を容易化することを可能とする。
【図面の簡単な説明】
【図１】この発明の実施形態に係る分散メモリ型マルチプロセッサシステムの概略構成およびこの分散メモリ型マルチプロセッサシステムに適用される分散共有メモリシステムの機能ブロックを示す図。
【図２】同実施形態のトランザクションデータの例を示す図。
【図３】同実施形態の頻出アイテム集合の抽出を効率的に処理する手法であるApriori のアルゴリズムを実行するプログラムの処理の流れを示すフローチャート。
【図４】図３に示した頻出アイテム集合の抽出処理において数え上げが行なわれるパス１、すなわち長さ１のアイテムの種類と出現頻度とからなる統計情報を管理するハッシュテーブルを示す図。
【図５】図３に示した頻出アイテム集合の抽出処理において数え上げが行なわれるパス２、すなわち長さ２のアイテムの種類と出現頻度とからなる統計情報を管理するハッシュテーブルを示す図。
【図６】同実施形態の分散共有メモリシステムにおける複数ノード１００による数え上げの並列処理の流れを示すフローチャート。
【図７】同実施形態の数え上げログの構造を示す図。
【図８】同実施形態の数量も扱ってアソシエイションルールを求める場合のトランザクションデータの構造を示す図。
【図９】数量も扱ってアソシエイションルールを求める場合の数え上げログ２０の構造を示す図。
【符号の説明】
１１…プロセス、１２…共有メモリ空間、１３…共有メモリ空間提供部、１４…共有メモリ空間内データ構造作成部、１５…アイテムの種類と出現頻度とからなる統計情報、１６…ハッシュテーブル、１７…トランザクションデータ、１８…アイテム出現頻度数え上げ部、１９…数え上げログ記録部、２０…数え上げログ、２１…数え上げログ転送部、２２…数え上げログ受信部、２３…数え上げログ反映部、１００…ノード、２００…ネットワーク。
【図１】
0003784949.tif 000002
【図２】
0003784949.tif 000003
【図３】
0003784949.tif 000004
【図４】
0003784949.tif 000005
【図５】
0003784949.tif 000006
【図６】
0003784949.tif 000007
【図７】
0003784949.tif 000008
【図８】
0003784949.tif 000009
【図９】
0003784949.tif 000010