(57)【要約】【課題】処理対象のデータが多い場合であっても速やかに名寄せを実行可能にする技術を提供することを目的とする。【解決手段】同一性の判定対象のレコードの数と、同一性の判定に係るルールの数と、に基づき、テーブルの各セルを所定の値で初期化したリンクテーブルを作成するリンクテーブル作成手段と、ルールを識別するルール識別子と、ルール識別子で識別されるルールに基づき同一と判定されたレコードを識別するレコード識別子の組と、を含むデータに基づき、リンクテーブル作成手段で作成され、所定の値で初期化されたリンクテーブルの該当するセルに、レコード間の同一性を表すリンクをリング状に設定するリンク設定手段と、を有することによって課題を解決する。【選択図】図１
2010122908.tif 000002
【特許請求の範囲】
【請求項１】
同一性の判定対象のレコードの数と、同一性の判定に係るルールの数と、に基づき、テーブルの各セルを所定の値で初期化したリンクテーブルを作成するリンクテーブル作成手段と、
前記ルールを識別するルール識別子と、前記ルール識別子で識別されるルールに基づき同一と判定されたレコードを識別するレコード識別子の組と、を含むデータに基づき、前記リンクテーブル作成手段で作成され、前記所定の値で初期化された前記リンクテーブルの該当するセルに、レコード間の同一性を表すリンクをリング状に設定するリンク設定手段と、
を有することを特徴とする情報処理装置。
【請求項２】
スレッドを生成し、生成したスレッドに対して前記リンクテーブルのレコード識別子を割り振る制御手段を更に有し、
前記スレッドは、割り振られたレコード識別子で識別されるレコードに関する各ルールのリンク先を再帰的に辿り、同一性を表すレコード識別子の組を生成することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記制御手段は、複数の前記スレッドを生成し、生成したスレッドに対して前記リンクテーブルのレコード識別子を割り振ることを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記制御手段は、出力スレッドを生成し、
前記出力スレッドは、前記複数のスレッドが生成したレコード識別子の組に含まれるレコード識別子の最大値又は最小値に基づいて、重複するレコード識別子の組を排除し、排除した結果のレコード識別子の組を名寄せの結果として出力することを特徴とする請求項３に記載の情報処理装置。
【請求項５】
同一性の判定対象のレコードと、同一性の判定に係るルールと、に基づき、前記データを生成するデータ生成手段を更に有することを特徴とする請求項１乃至４の何れか１項に記載の情報処理装置。
【請求項６】
情報処理装置における情報処理方法であって、
同一性の判定対象のレコードの数と、同一性の判定に係るルールの数と、に基づき、テーブルの各セルを所定の値で初期化したリンクテーブルを作成するリンクテーブル作成ステップと、
前記ルールを識別するルール識別子と、前記ルール識別子で識別されるルールに基づき同一と判定されたレコードを識別するレコード識別子の組と、を含むデータに基づき、前記リンクテーブル作成ステップで作成され、前記所定の値で初期化された前記リンクテーブルの該当するセルに、レコード間の同一性を表すリンクをリング状に設定するリンク設定ステップと、
を有することを特徴とする情報処理方法。
【請求項７】
コンピュータを、
同一性の判定対象のレコードの数と、同一性の判定に係るルールの数と、に基づき、テーブルの各セルを所定の値で初期化したリンクテーブルを作成するリンクテーブル作成手段と、
前記ルールを識別するルール識別子と、前記ルール識別子で識別されるルールに基づき同一と判定されたレコードを識別するレコード識別子の組と、を含むデータに基づき、前記リンクテーブル作成手段で作成され、前記所定の値で初期化された前記リンクテーブルの該当するセルに、レコード間の同一性を表すリンクをリング状に設定するリンク設定手段と、
して機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理方法及びプログラムに関する。
【背景技術】
【０００２】
従来、多くの企業においてユーザ情報の管理を行っている。しかしながら、一つのシステム内で同一ユーザのユーザ情報が複数登録されていたり、複数のシステムにそれぞれ同一ユーザのユーザ情報が登録されていたりする場合がある。このような場合、一般的に、同一ユーザのユーザ情報を一つにまとめる所謂名寄せが行われる。
名寄せの方法としては、例えば特許文献１が知られている。
【０００３】
【特許文献１】特開２００３−７６８３８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかし、上記方法の場合、データの内容によっては処理回数が膨大となり現実的な時間内に名寄せ処理ができないおそれがある。
【０００５】
本発明はこのような問題点に鑑みなされたもので、処理対象のデータが多い場合であっても速やかに名寄せを実行可能にする技術を提供することを目的とする。
【課題を解決するための手段】
【０００６】
そこで、本発明は、同一性の判定対象のレコードの数と、同一性の判定に係るルールの数と、に基づき、テーブルの各セルを所定の値で初期化したリンクテーブルを作成するリンクテーブル作成手段と、前記ルールを識別するルール識別子と、前記ルール識別子で識別されるルールに基づき同一と判定されたレコードを識別するレコード識別子の組と、を含むデータに基づき、前記リンクテーブル作成手段で作成され、前記所定の値で初期化された前記リンクテーブルの該当するセルに、レコード間の同一性を表すリンクをリング状に設定するリンク設定手段と、を有することを特徴とする。
【０００７】
係る構成とすることにより、レコード間の同一性を表すリンクをリング状に設定することができ、リンクテーブルが単純化され、並列処理することができるので、処理対象のデータが多い場合であっても速やかに名寄せを実行可能にする技術を提供することができる。
なお、所定の値とは、例えば、後述するゼロ（０）に対応する。また、データとは、例えば、後述するファイル生成部で生成されるファイル等に対応する。また、リンクをリング状に設定するとは、後述するように、例えば、４から６、６から１０、１０から４等の様に枝分かれがなく、サイクリック（巡回的）にリンクを張る（リンクを設定する）こと等に対応する。
【０００８】
また、本発明は、情報処理方法及びプログラムとしてもよい。
【発明の効果】
【０００９】
本発明によれば、処理対象のデータが多い場合であっても速やかに名寄せを実行可能にする技術を提供することができる。
【発明を実施するための最良の形態】
【００１０】
以下、本発明の実施形態について図面に基づいて説明する。
【００１１】
＜実施形態１＞
図１は、情報処理装置（コンピュータ）１のハードウェア構成の一例を示す図である。図１に示されるように情報処理装置１は、ハードウェア構成として、ＣＰＵ１１を含む。
ＣＰＵ１１が、記憶装置１３に記憶されている、プログラムに基づき処理を行うことによって、後述する機能、又はフローチャートに係る処理を実現する。
【００１２】
また、ＣＰＵ１１には、バス１０を介して、入力装置１２、記憶装置１３及び表示装置１４が接続されている。記憶装置１３は、例えば、ＲＯＭ、ＲＡＭ、ハードディスク装置等からなり、上述した各プログラム以外に、プログラムに基づく処理で用いられるデータ（例えば後述するファイルやテーブル等）を記憶する。表示装置１４は、情報を表示する例えばディスプレイ等である。入力装置１２は、情報を入力する例えばキーボード及び／又はマウス等である。
なお、図１では説明の簡略化のため、ＣＰＵは１つしか図示していないが、処理の高速化等のため、情報処理装置は、複数のＣＰＵを有していてもよい。
【００１３】
図２は、情報処理装置１の機能構成の一例を示す図である。図２に示されるように、情報処理装置１は、機能構成として、ファイル生成部２１と、リンクテーブル作成部２２と、リンク設定部２３と、制御部２４と、を含む。
ファイル生成部２１は、同一性の判定対象のレコードと、同一性の判定に係るルールと、に基づき、後述する図６に示すようなファイルを生成する。
リンクテーブル作成部２２は、同一性の判定に係るルールのルール数と、同一性の判定対象のレコードのレコード数と、に基づき、テーブルの各セルを所定の値（本実施形態の例ではゼロ）で初期化したリンクテーブルを作成する。
【００１４】
リンク設定部２３は、ファイル生成部２１で生成されたファイルに基づき、リンクテーブル作成部２２で作成された各セルがゼロで初期化されたリンクテーブルの該当するセルに、レコード間の同一性を表すリンクをリング状（環状）に設定する。
制御部２４は、複数のスレッドを生成し、生成したスレッドに対してリンクテーブルのレコード番号を割り振る。前記スレッドは、割り振られたレコード番号で識別されるレコード（リンクテーブルのレコード）に関する各ルールのリンク先を再帰的に辿り、同一性を表すレコード番号の組（図６のファイルに示されるような組）を生成する。また、制御部２４は、出力スレッドを生成する。出力スレッドは、各スレッドが生成したレコード番号の組に含まれるレコード番号の最大値又は最小値に基づいて、重複するレコード番号の組を排除し、重複するレコード番号の組を排除した結果のレコード番号の組を、名寄せの結果として出力する。
図３は、同一性の判定対象のレコードを含む入力データの一例を示す図である。
図３に示されるように、本実施形態では、入力データとして、住所コード、補助住所（番地以下の住所を示すコード）、カナ氏名、生年月日、電話番号（電話）等のフィールドからなるテキストファイルを想定している。また、入力データの各フィールドはクレンジング済みであり、同一性の判定は文字列の完全一致により判断できる状態になっているものとする。この入力データは、例えば、情報処理装置１とネットワークを介して接続された他の装置から入力される。
【００１５】
ここで、図３に示される※１、※２、・・・で示されるレコードは、以下のルールに基づき、同一個人のレコードであると判定することができるレコードであることを示している。
（ルール１）：電話が一致した場合、同一個人のレコード
（ルール２）：住所コード、補助住所、カナ氏名、生年月日が一致した場合、同一個人のレコード
なお、これらのルールは、例えばルールファイル等に記述されているものとする。入力データと同様、このルールファイルも、例えば、情報処理装置１とネットワークを介して接続された他の装置から入力される。
【００１６】
ファイル生成部２１がルール１に基づき、図３に示される入力データから同一個人のレコードのレコード番号を同じグループになるよう分類した結果の一例を図４に示す。また、ファイル生成部２１がルール２に基づき、図３に示される入力データから同一個人のレコードのレコード番号を同じグループになるよう分類した結果の一例を図５に示す。
ファイル生成部２１は、分類した結果（図４の（Ａ）及び図５の（Ｂ））を合わせて１ファイルにする。なお、このとき、ファイル生成部２１は、複数のレコード番号を含むエントリーのみを抽出し、ファイルに記述する。また、ファイル生成部２１は、ルールを識別するルール番号と、前記ルールに基づき同一と判定されたレコードのレコード番号の組（グループ）と、を対応付けてファイルに記述する。図６は、ファイル生成部２１が生成したファイルの一例を示す図である。
【００１７】
次に、リンクテーブル作成部２２は、図３に示されるような同一性の判定対象のレコード数と、同一性の判定に係る上述したルールの数（ルール数）と、に基づき、テーブルの各セルをゼロで初期化したリンクテーブルを作成する。なお、レコード数１億、ルール数１３の場合、リンクテーブルの大きさは５ＧＢ程度となった。
【００１８】
次に、リンク設定部２３は、ファイル生成部２１で生成された、図６に示すようなファイルに基づき、リンクテーブル作成部２２で生成され、ゼロで初期化された前記リンクテーブルの該当するセルに、レコード間の同一性を表すリンクをリング状に設定する。
例えば、ファイル生成部２１で生成されたファイルに
ルール番号が１、同一個人を表すレコード番号の組が３，５
と記述されていた場合、リンク設定部２３は、図７に示されるように、ルール１の列のレコード番号３のセルに、レコード番号５へのリンク（レコード間の同一性を表すリンク）を設定する。
【００１９】
より詳細にリンク設定部２３の処理を説明すると、リンク設定部２３は、ファイル生成部２１で生成された、図６に示すようなファイルを１レコードずつ読みながら、グループ（ファイルの１レコードに含まれるレコード番号の集合）のレコード間の関係をリンクとしてリング状に設定する。このとき、リンク設定部２３は、図６に示されるようなファイルのレコードに含まれるルール番号の列でリンクを設定する（リンクを張る）。
例えば、ファイル生成部２１で生成されたファイルに
ルール番号が３、同一個人を表すレコード番号の組が４，６，１０
と記述されていた場合、リンク設定部２３は、図８に示されるように、ルール３の列のレコード番号４のセルに、レコード番号６へのリンク（レコード間の同一性を表すリンク）を、また、レコード番号６のセルに、レコード番号１０へのリンクを、また、レコード番号１０のセルに、レコード番号４へのリンクを設定する。つまり、リンク設定部２３は、４から６、６から１０、１０から４等の様に枝分かれがなく、かつ、サイクリックにリンクを設定する。なお、レコード間にリンクを設定する際、リンク設定部２３は、全てのレコードをリンクに沿って辿ることができればよいため、設定する順序は問わずにリンクを設定する。
【００２０】
なお、レコード間にリンクを設定する際、リンク設定部２３は、全てのレコードをリンクに沿って辿ることができればよいため、設定する順序は問わずにリンクを設定する。
例えば、ファイル生成部２１で生成されたファイルに
ルール番号が４、同一個人を表すレコード番号の組が７，４，１１，２
と記述されていた場合、リンク設定部２３は、図９に示されるように、ルール４の列のレコード番号７のセルに、レコード番号４へのリンクを、また、レコード番号４のセルに、レコード番号１１へのリンクを、また、レコード番号１１のセルに、レコード番号２へのリンクを、また、レコード番号２のセルに、レコード番号７へのリンクを設定する。つまり、上述したように、リンク設定部２３は、レコード間にリンクをリング状に設定する際、レコード番号の昇順、降順でリンクを設定する必要がない。
【００２１】
リンク設定部２３が上述した処理を繰り返すことによって、リンクテーブルにリンクがリング状に設定される。ファイル生成部２１で生成されたファイルの各レコードに対するセル群（図９の例では、網掛けの部分）は、前記ファイルの各レコード間で重なることがないため、リンク設定部２３におけるリンク設定の処理（リンク生成の処理）は、排他制御なしで前記ファイルのレコード毎に並列に処理することができる。
また、リンク設定部２３が、リンクをリング状に設定することによって、リンクテーブルが単純化され、処理対象のデータが多い場合であっても速やかに名寄せを実行可能にする技術を提供することができる。
【００２２】
リンク設定部２３が、ファイル生成部２１で生成されたファイルの全レコードに対してリンク設定の処理を実行すると、次に、制御部２４は、複数のスレッドを生成し、生成したスレッドに対してリンクテーブルのレコード番号を割り振る。前記スレッドは、割り振られたレコード番号で識別されるレコード（リンクテーブルのレコード）に関する各ルールのリンク先を再帰的に辿り、同一性を表すレコード番号の組を生成させる。また、制御部２４は、出力スレッドを生成する。出力スレッドは、前記複数のスレッドが生成したレコード番号の組に含まれるレコード番号の最大値又は最小値に基づいて、重複するレコード番号の組を排除し、排除した結果のレコード番号の組を名寄せの結果として出力する。
【００２３】
以下、制御部２４の処理をより具体的に説明する。
制御部２４は、出力済み集合オブジェクトｔ０、出力キューｑ１、出力スレッド０１を生成する。
また、制御部２４は、スレッドａ１〜ａｋを生成し、それぞれのスレッドに対応する集合オブジェクトｔ１〜ｔｋを生成する。ここで、ｋは、例えばＣＰＵの数等、情報処理装置１のハードウェアリソースに基づいて制御部２４が決定する値である。
制御部２４は、１番から図６のファイルのレコード数ｎ番までの各レコード番号ｍについて、以下の処理をラウンドロビン等でスレッドａ１〜ａｋに振り分け、並列で実行させる。ここで、図１０は、スレッドと、並列処理と、の関係の一例を示す図である。
【００２４】
スレッドａｎは、レコード番号ｍのルール１〜ルールｒに含まれるリンクを再帰的に辿り、通ったレコード番号の集合ｓとｓに含まれるレコード番号の最大値ｍａｘを取得する。ここで、ｎは、ｋ以下の正の整数である。なお、スレッドａｎは、辿ったレコード番号を集合ｔｎに追加する。なお、スレッドａｎは、同一のレコード番号が集合ｔｎに含まれている場合には、それ以上、再帰的にリンクを辿らない。
スレッドａｎは、リンクを再帰的に辿った結果の、集合ｓとレコード番号の最大値ｍａｘとの組を、出力キューｑ１に投入する。
【００２５】
出力スレッドｏ１は、出力キューｑ１からｓとｍａｘとの組を取り出し、出力済み集合ｔ０にｍａｘが含まれているか否かを確認する。出力スレッドｏ１は、ｔ０にｍａｘが含まれている場合には何もせず、ｔ０にｍａｘが含まれていなければｔ０にｍａｘを追加し、ｓに含まれるレコード番号をファイルに出力する。
【００２６】
以下、図１１に示されるように、レコード数が７、ルール数が２のリンクテーブルを例に、スレッドによる処理及びマルチスレッドを説明する。
制御部２４は、２つのスレッド、スレッドａ１と、スレッドａ２と、を生成し、ａ１には、奇数番のレコード（つまり、レコード１、３、５、７）を、ａ２には、偶数版のレコード（つまり、レコード２、４、６、８）を割り振ったものとする。
まず、スレッドａ１は、探索したレコードを入れておく変数ｔ１を以下のように初期化する。
ｔ１＝｛｝
【００２７】
次に、スレッドａ１は、レコード番号１に対する処理を行う。
スレッドａ１は、レコード番号１がｔ１に含まれているか否かを判定する。この例の場合、ｔ１＝[]なので、レコード番号１は、ｔ１に含まれていない。したがって、スレッドａ１は、変数を以下のように初期化する。
ｓ＝｛１｝
ｍａｘ＝１
また、スレッドａ１は、レコード番号１をｔ１に追加する。
その結果、ｔ１＝｛１｝となる。
スレッドａ１は、図１２に示されるように、リンクテーブルのレコード番号１の行に注目すると、レコード１を起点とするリンクの先はレコード５であることが分かる。
よって、スレッドａ１は、レコード番号５がｔ１に含まれているか否かを確認する。この例の場合、ｔ１＝｛１｝なので、レコード番号５は含まれていない。よって、スレッドａ１は、レコード５はまだリンクを辿っていないと判断し、ｔ１に５を追加する。
また、スレッドａ１は、ｓに５を追加する。また、スレッドａ１は、ｍａｘ＝１と、５と、を比較し、大きい方の値（５）で、ｍａｘを更新する。
結果として、
ｔ１＝｛１，５｝
ｓ＝｛１，５｝
ｍａｘ＝５
となる。
【００２８】
次に、スレッドａ１は、図１３に示されるように、レコード番号５の行に注目すると、レコード５を起点とするリンクの先はレコード１であることが分かる。
したって、スレッドａ１は、レコード番号１がｔ１に含まれているか否かを確認する。
上述したように、ｔ１＝｛１，５｝であるため、レコード番号１は既にｔ１に含まれている。よって、スレッドａ１は、レコード１は既に辿っていると判断する。レコード１から辿ることができる全てのレコードを辿り終えたため、スレッドａ１は、（ｓ，ｍａｘ）＝（｛１，５｝，５）をｑ１に投入する。
【００２９】
次に、スレッドａ１は、レコード番号３に対する処理を行う。
スレッドａ１は、レコード番号３がｔ１に含まれているか否かを判定する。この例の場合、ｔ１＝[１，５]なので、レコード番号３は、ｔ１に含まれていない。したがって、スレッドａ１は、変数を以下のように初期化する。
ｓ＝｛３｝
ｍａｘ＝３
また、スレッドａ１は、レコード番号３をｔ１に追加する。
その結果、ｔ１＝｛１，５，３｝となる。
スレッドａ１は、図１４に示されるように、リンクテーブルのレコード番号３の行に注目すると、レコード３を起点とするリンクの先はレコード７であることが分かる。
よって、スレッドａ１は、レコード番号７がｔ１に含まれているか否かを確認する。この例の場合、ｔ１＝｛１，５，３｝なので、レコード番号７は含まれていない。よって、スレッドａ１は、レコード７はまだリンクを辿っていないと判断し、ｔ１に７を追加する。
また、スレッドａ１は、ｓに７を追加する。また、スレッドａ１は、ｍａｘ＝３と、７と、を比較し、大きい方の値（７）で、ｍａｘを更新する。
結果として、
ｔ１＝｛１，５，３，７｝
ｓ＝｛３，７｝
ｍａｘ＝７
となる。
【００３０】
次に、スレッドａ１は、図１５に示されるように、レコード番号７の行に注目すると、レコード７を起点とするリンクの先はレコード３とレコード４とであることが分かる。
したって、スレッドａ１は、レコード番号３がｔ１に含まれているか否かを確認する。
上述したように、ｔ１＝｛１，５，３，７｝であるため、レコード番号３は既にｔ１に含まれている。よって、スレッドａ１は、レコード３は既に辿っていると判断する。
また、スレッドａ１は、レコード番号４がｔ１に含まれているか否かを確認する。
上述したように、ｔ１＝｛１，５，３，７｝であるため、レコード番号４はｔ１に含まれていない。よって、スレッドａ１は、レコード４はまだリンクを辿っていないと判断し、ｔ１に４を追加する。
また、スレッドａ１は、ｓに４を追加する。また、スレッドａ１は、ｍａｘ＝７と、４と、を比較し、大きい方の値（７）で、ｍａｘを更新する。
結果として、
ｔ１＝｛１，５，３，７，４｝
ｓ＝｛３，７，４｝
ｍａｘ＝７
となる。
【００３１】
次に、スレッドａ１は、図１６に示されるように、レコード番号４の行に注目すると、レコード４を起点とするリンクの先はレコード７であることが分かる。
したって、スレッドａ１は、レコード番号７がｔ１に含まれているか否かを確認する。
上述したように、ｔ１＝｛１，５，３，７，４｝であるため、レコード番号７は既にｔ１に含まれている。よって、スレッドａ１は、レコード７は既に辿っていると判断する。レコード３から辿ることができる全てのレコードを辿り終えたため、スレッドａ１は、（ｓ，ｍａｘ）＝（｛３，７，４｝，７）をｑ１に投入する。
【００３２】
次に、スレッドａ１は、レコード番号５に対する処理を行う。
スレッドａ１は、レコード番号５がｔ１に含まれているか否かを判定する。この例の場合、ｔ１＝[１，５，３，７，４]なので、レコード番号５は、ｔ１に含まれている。よって、スレッドａ１は、レコード番号５は既に辿っていると判断する。
次に、スレッドａ１は、レコード番号７に対する処理を行う。
スレッドａ１は、レコード番号７がｔ１に含まれているか否かを判定する。この例の場合、ｔ１＝[１，５，３，７，４]なので、レコード番号７は、ｔ１に含まれている。よって、スレッドａ１は、レコード番号７は既に辿っていると判断する。
以上で、スレッドａ１の処理は終了する。
スレッドａ２も同様の処理を行うため、ここでは説明を省略する。
【００３３】
ここで、スレッドａ１と、スレッドａ２と、は同時に処理を進めるため、各スレッドから出力キューに投入される（ｓ，ｍａｘ）の投入の順番は処理の度に異なる可能性がある。出力キューｑ１に図１７に示されるような順番で（ｓ，ｍａｘ）が投入されたものとする。なお、出力スレッドｏ１は、（ｓ，ｍａｘ）が投入される度に、出力キューｑ１から読み出すため、図１７のように全ての（ｓ，ｍａｘ）が出力キューｑ１に滞留しているわけではない。
【００３４】
以下、出力スレッドｏ１のより具体的な処理の一例を説明する。
出力スレッドｏ１は、変数を以下のように初期化する。
ｔ０＝｛｝
次に、出力スレッドｏ１は、出力キューｑ１から一番先に投入された要素（ｓ，ｍａｘ）＝（｛１，５｝，５）を取り出す。
出力スレッドｏ１は、（ｓ，ｍａｘ）＝（｛１，５｝，５）のｍａｘの値＝５がｔ０に含まれているか否かを確認する。この例の場合、ｔ０＝｛｝なので含まれていない。
よって、出力スレッドｏ１は、ｓ＝｛１，５｝に含まれるレコード番号１と、レコード番号５と、が同一人物であるという名寄せの結果を結果ファイル等に出力し、ｔ０にｍａｘ＝５を追加する。その結果、ｔ０＝｛５｝となる。
【００３５】
次に、出力スレッドｏ１は、出力キューｑ１から、次の要素（ｓ，ｍａｘ）＝（｛２，６｝，６）を取り出す。
出力スレッドｏ１は、（ｓ，ｍａｘ）＝（｛２，６｝，６）のｍａｘの値＝６がｔ０に含まれているか否かを確認する。この例の場合、ｔ０＝｛５｝なので含まれていない。
よって、出力スレッドｏ１は、ｓ＝｛２，６｝に含まれるレコード番号２と、レコード番号６と、が同一人物であるという名寄せの結果を結果ファイル等に出力し、ｔ０にｍａｘ＝６を追加する。その結果、ｔ０＝｛５，６｝となる。
次に、出力スレッドｏ１は、出力キューｑ１から、次の要素（ｓ，ｍａｘ）＝（｛３，７，４｝，７）を取り出す。
力スレッドｏ１は、（ｓ，ｍａｘ）＝（｛３，７，４｝，７）のｍａｘの値＝７がｔ０に含まれているか否かを確認する。この例の場合、ｔ０＝｛５，６｝なので含まれていない。
よって、出力スレッドｏ１は、ｓ＝｛３，７，４｝に含まれるレコード番号３と、レコード番号７と、レコード番号４と、が同一人物であるという名寄せの結果を結果ファイル等に出力し、ｔ０にｍａｘ＝７を追加する。その結果、ｔ０＝｛５，６，７｝となる。
【００３６】
次に、出力スレッドｏ１は、出力キューｑ１から、次の要素（ｓ，ｍａｘ）＝（｛４，７，３｝，７）を取り出す。
出力スレッドｏ１は、（ｓ，ｍａｘ）＝（｛４，７，３｝，７）のｍａｘの値＝７がｔ０に含まれているか否かを確認する。この例の場合、ｔ０＝｛５，６，７｝なので含まれている。よって、出力スレッドｏ１は、既に同じ結果を出力済みであるため、何もしない。
出力スレッドｏ１は、出力キューｑ１に処理すべき要素が無くなったので出力処理を終了する。
【００３７】
ｔ０、ｔ１〜ｔｋは、要素数の上限が図６に示されるファイルのレコード数なので、Ｂｉｔｍａｐ等を使って実装することで高速に処理をすることができる。また、図１０に示されるような、複数のスレッドによる並列処理は、排他制御せずに実行することができる。結果として、重複する結果が出力キューに投入されることになるが、ｍａｘの値に基づき、重複するレコード番号の組を排除している。なお、上述した例では、出力スレッドｏ１は、ｍａｘ（つまり最大値）の値に基づいて、重複を排除しているが、ｍｉｎ（つまり最小値）の値に基づいて、重複を排除するようにしてもよい。
【００３８】
また、図１０に示されるように、複数のスレッドによって、出力キューｑ１に書き込みが行われるが、投入する単位をある程度まとめた単位とすることで、排他制御のオーバーヘッドを無視できるレベルに抑えることができる。また、出力済み集合ｔのチェックはスレッドｏ１単体で行うため、排他制御は不要である。よって、Ｂｉｔｍａｐ等を使って実装することで高速に処理をすることができる。
【００３９】
以下、フローチャートを用いて、上述した処理を説明する。
図１８は、図６に示すようなファイルを生成するファイル生成処理の一例を示すフローチャートである。
ステップＳ１０において、ファイル生成部２１は、ルール番号Ｒに１を設定する。
ステップＳ１１において、ファイル生成部２１は、ルール番号Ｒが入力等されたルール数以下か否かを判定する。ファイル生成部２１は、ルール番号Ｒがルール数以下の場合、ステップＳ１２に進み、ルール番号Ｒがルール数以下でない場合、図１８に示す処理を終了する。
【００４０】
ステップＳ１２において、ファイル生成部２１は、カレントレコード番号Ｃに１を設定し、ハッシュテーブルＨをクリアする。
ステップＳ１３において、ファイル生成部２１は、カレントレコード番号Ｃが入力等されたレコード数以下か否かを判定する。ファイル生成部２１は、カレントレコード番号Ｃがレコード数以下の場合、ステップＳ１４に進み、カレントレコード番号Ｃがレコード数以下でない場合、ステップＳ１８に進む。
【００４１】
ステップＳ１４において、ファイル生成部２１は、カレントレコード番号Ｃからルール番号Ｒのルールが指定するフィールドの組Ｔを取得する。
ステップＳ１５において、ファイル生成部２１は、ステップＳ１４で取得したフィールドの組Ｔがブランクを含むか否かを判定する。ファイル生成部２１は、フィールドの組Ｔがブランクを含む場合、ステップＳ１７に、ブランクを含まない場合、ステップＳ１６に進む。
ステップＳ１６において、ファイル生成部２１は、ハッシュテーブルに、キー＝フィールドの組Ｔに対応する集合にカレントレコード番号Ｃを追加する。
ステップＳ１７において、ファイル生成部２１は、カレントレコード番号Ｃを一つインクリメントする。ステップＳ１７の処理の後、ファイル生成部２１は、ステップＳ１３に処理を戻す。
【００４２】
ステップＳ１８において、ファイル生成部２１は、ハッシュテーブルＨの各キーに対応する集合の要素をファイルに出力する。但し、ファイル生成部２１は、要素数が１のものは出力しない。
ステップＳ１９において、ファイル生成部２１は、ルール番号Ｒを一つインクリメントする。ステップＳ１９の処理の後、ファイル生成部２１は、ステップＳ１１に処理を戻す。
【００４３】
図１９は、リンク設定部２３による処理及び制御部２４による処理の一例を示すフローチャートである。なお、リンクテーブル作成部２２におけるリンクテーブルの生成は既に終了しているものとする。
ステップＳ２０において、リンク設定部２３は、入力データ（図２２の処理で作成されたファイル）から１レコード読み込み、カレントレコード番号Ｃに設定する。
ステップＳ２１において、リンク設定部２３は、読み込んだレコードが入力データのＥＯＦ（Ｅｎｄ  Ｏｆ  Ｆｉｌｅ）か否かを判定する。リンク設定部２３は、読み込んだレコードが入力データのＥＯＦであった場合、ステップＳ２３に進み、読み込んだレコードが入力データのＥＯＦでない場合、ステップＳ２２に進む。
【００４４】
ステップＳ２２において、リンク設定部２３は、リンクテーブルＬにカレントレコード番号Ｃの内容を設定する。
一方、ステップＳ２３において、制御部２４は、スレッドａ１〜ａｋと、各スレッドに対応する集合オブジェクトｔ１〜ｔｋと、を作成する。なお、制御部２４は、処理するレコード番号の範囲を指定してスレッドａ１〜ａｋを生成する。例えば、制御部２４は、ａ１に対してはｎ（＝レコード数）以下のｋの倍数＋１、ａ２に対してはｎ以下のｋの倍数＋２、・・・、ａｋはｎ以下の倍数等とスレッドにレコード番号を割り当てる。
ステップＳ２４において、制御部２４は、出力済み集合オブジェクトｔ０、出力キューｑ１、出力スレッドｏ１を作成する。
ステップＳ２５において、制御部２４は、出力スレッドｏ１による処理の終了を待つ。
【００４５】
図２０は、スレッドａ１の処理の一例を示すフローチャートである。なお、スレッドａ２〜ａｋも処理の内容は同様である。
ステップＳ３０において、スレッドａ１は、レコード番号Ｎに１を代入する。
ステップＳ３１において、スレッドａ１は、レコード番号Ｎが入力等されたレコード数以下か否かを判定する。スレッドａ１は、レコード番号Ｃがレコード数以下の場合、ステップＳ３２に進み、レコード番号Ｃがレコード数以下でない場合、ステップＳ３５に進む。
ステップＳ３２において、スレッドａ１は、リンクテーブルＬのレコード番号Ｎについて、リンクを再帰的に辿り、通ったレコード番号の集合ｓと、ｓに含まれるレコード番号の最大値ｍａｘと、を取得する。スレッドａ１は、同一のレコード番号が集合ｔｎに含まれている場合には、それ以上、再帰的にリンクを辿らず、辿ったレコード番号を集合ｔｎに追加する。
【００４６】
ステップＳ３３において、スレッドａ１は、ｓと、ｍａｘと、の組を出力キューｑ１に投入する。
ステップＳ３４において、スレッドａ１は、レコード番号にｋを加え、ステップＳ３１に戻る。
一方、ステップＳ３５において、スレッドａ１は、ＮＵＬＬ値をｑ１に投入する。
【００４７】
図２１は、スレッドｏ１の処理の一例を示すフローチャートである。
ステップＳ４０において、スレッドｏ１は、ａ１〜ａｋのうち、終了したスレッドの数を表すＤに０（ゼロ）を代入し、初期化する。
ステップＳ４１において、スレッドｏ１は、ｑ１から要素を取り出し、変数Ｅに代入する。
ステップＳ４２において、スレッドｏ１は、ＥがＮＵＬＬか否かを判定する。スレッドｏ１は、ＥがＮＵＬＬでない場合、ステップＳ４３に進み、ＥがＮＵＬＬの場合、ステップＳ４７に進む。なお、これは、処理対象となるレコード番号の処理を全て終えたことを意味する値としてＮＵＬＬ値を用いた場合の例である。ｑ１に投入する、処理を全て終えたことを意味する値として他の値を用いてもよい。
【００４８】
ステップＳ４３において、スレッドｏ１は、Ｅからｓとｍａｘとを抽出し、（ｓ，ｍａｘ）に追加する。
ステップＳ４４において、スレッドｏ１は、ｔ０にｍａｘが含まれるか否かを判定する。ｔ０にｍａｘが含まれている場合、ステップＳ４１に進み、ｔ０にｍａｘが含まれていない場合、ステップＳ４５に進む。
ステップＳ４５において、スレッドｏ１は、ｔ０にｍａｘを追加する。
ステップＳ４６において、スレッドｏ１は、ｓに含まれるレコード番号の組をファイルに出力する。
【００４９】
一方、ステップＳ４７において、スレッドｏ１は、Ｄの値を１つインクリメントする。ステップＳ４８において、スレッドｏ１は、Ｄがｋに達したか否かを判定する。スレッドｏ１は、Ｄがｋに達した場合、図２１に示す処理を終了し、Ｄがｋに達していない場合、ステップＳ４１に進む。
【００５０】
以上、上述した本実施形態によれば、処理対象のデータが多い場合であっても速やかに名寄せを実行可能にする技術を提供することができる。
【００５１】
＜実施形態２＞
上述した実施形態では、制御部２４は、複数スレッドを生成し、複数スレッドに並列処理を実行させる例を用いて説明を行った。しかしながら、制御部２４は、図２２に示されるように、１スレッドのみを生成し、上述した名寄せの制御を実行するようにしてもよい。
【００５２】
制御部２４は、スレッドａ１（メインスレッドでもよい）と、集合オブジェクトｔ１と、を生成する。スレッドａ１は、各レコード番号ｍ（ｍ＝１、２、・・・、ｎ）について、以下の処理を行う。
スレッドａ１は、レコード番号ｍのルール１〜ルールｒのリンク先を再帰的に辿る。このときスレッドａ１は、リンクを辿る際に、レコード番号を集合オブジェクトｔ１に追加し、既に集合オブジェクトｔ１にレコード番号が含まれている場合は、そのレコード番号以降のリンク先は辿らない。そして、スレッドａ１は、結果ファイル等に同一個人のレコード番号の組を出力する。
【００５３】
同一個人を表す複数のレコード番号を出力する方法として、例えば、スレッドａ１は、同一個人のレコード番号を１行に出力する。このとき、スレッドａ１は、同じ個人がファイル中で連続するように出力し、別の個人に代わるときにマーク（例えば改行等）を入れる。
【００５４】
以上、上述した本実施形態によれば、制御部２４による制御（又は作り）を単純化することができる。そのため、メンテナンス等も容易に行うことができる。
【００５５】
以上、上述した各実施形態によれば、処理対象のデータが多い場合であっても速やかに名寄せを実行可能にする技術を提供することができる。
【００５６】
以上、本発明の好ましい実施形態について詳述したが、本発明は係る特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【図面の簡単な説明】
【００５７】
【図１】情報処理装置（コンピュータ）１のハードウェア構成の一例を示す図である。
【図２】情報処理装置１の機能構成の一例を示す図である。
【図３】同一性の判定対象のレコードを含む入力データの一例を示す図である。
【図４】入力データから同一個人のレコードのレコード番号を同じグループになるよう分類した結果の一例を示す図である。
【図５】入力データから同一個人のレコードのレコード番号を同じグループになるよう分類した結果の一例を示す図である。
【図６】ファイル生成部２１が生成したファイルの一例を示す図である。
【図７】リンクの一例を示す図である。
【図８】リンク設定の一例を示す図（その１）である。
【図９】リンク設定の一例を示す図（その２）である。
【図１０】スレッドと、並列処理と、の関係の一例を示す図である。
【図１１】スレッドの処理を説明するためのリンクテーブルの一例を示す図（その１）である。
【図１２】スレッドの処理を説明するためのリンクテーブルの一例を示す図（その２）である。
【図１３】スレッドの処理を説明するためのリンクテーブルの一例を示す図（その３）である。
【図１４】スレッドの処理を説明するためのリンクテーブルの一例を示す図（その４）である。
【図１５】スレッドの処理を説明するためのリンクテーブルの一例を示す図（その５）である。
【図１６】スレッドの処理を説明するためのリンクテーブルの一例を示す図（その６）である。
【図１７】出力キューｑ１の一例を示す図である。
【図１８】図６に示すようなファイルを生成するファイル生成処理の一例を示すフローチャートである。
【図１９】リンク設定部２３による処理及び制御部２４による処理の一例を示すフローチャートである。
【図２０】スレッドａ１の処理の一例を示すフローチャートである。
【図２１】スレッドｏ１の処理の一例を示すフローチャートである。
【図２２】１スレッドの一例を示す図である。
【符号の説明】
【００５８】
１１  ＣＰＵ
１２  入力装置
１３  記憶装置
１４  表示装置
【図１】
2010122908.tif 000003
【図２】
2010122908.tif 000004
【図３】
2010122908.tif 000005
【図４】
2010122908.tif 000006
【図５】
2010122908.tif 000007
【図６】
2010122908.tif 000008
【図７】
2010122908.tif 000009
【図８】
2010122908.tif 000010
【図９】
2010122908.tif 000011
【図１０】
2010122908.tif 000012
【図１１】
2010122908.tif 000013
【図１２】
2010122908.tif 000014
【図１３】
2010122908.tif 000015
【図１４】
2010122908.tif 000016
【図１５】
2010122908.tif 000017
【図１６】
2010122908.tif 000018
【図１７】
2010122908.tif 000019
【図１８】
2010122908.tif 000020
【図１９】
2010122908.tif 000021
【図２０】
2010122908.tif 000022
【図２１】
2010122908.tif 000023
【図２２】
2010122908.tif 000024