(57)【特許請求の範囲】
【請求項１】
複数のＮビットの入力データにおける同じビット位置のビットデータを含むスキャンデータを、ビット位置順に取得する取得部と、
前記取得されるスキャンデータを用いてマスクデータにマスクをかけるマスク処理と前記マスク処理の結果に応じた前記マスクデータの更新処理とを含むビットスキャン処理を行い、前記第１のビット位置のスキャンデータから前記第Ｎのビット位置のスキャンデータまで前記ビットスキャン処理を繰り返すスキャンダウン処理を行うスキャンダウン部と、
前記スキャンダウン処理ごとに得られる同値の前記入力データをソート順に逐次出力する出力部と、
を備えるデータ処理装置。
【請求項２】
前記ビットスキャン処理では、前記マスク処理の結果が０の場合、前記マスクデータの更新処理をスキップする、
請求項１に記載のデータ処理装置。
【請求項３】
前記マスク処理では、前記入力データを昇順にソートする場合、前記マスクデータに対し前記スキャンデータの反転データを使ってマスクをかけ、前記入力データを降順にソートする場合、前記マスクデータに対し前記スキャンデータをそのまま使ってマスクをかける、
請求項１または２に記載のデータ処理装置。
【請求項４】
前記複数の入力データのうちソート対象のデータに対応するマスタマスクを保持する保持部をさらに備え、
前記スキャンダウン部は、前記マスタマスクを前記マスクデータの初期値として、第１のビット位置のスキャンデータから第Ｎのビット位置のスキャンデータに対し前記スキャンダウン処理を開始し、前記スキャンダウン処理を繰り返す、
請求項１乃至３のいずれか一項に記載のデータ処理装置。
【請求項５】
前記スキャンダウン部は、前記スキャンダウン処理の終了ごとに、処理結果に応じて前記マスタマスクを更新する、
請求項４に記載のデータ処理装置。
【請求項６】
前記マスタマスクの更新では、前記マスタマスクと前記スキャンダウン処理の結果の反転データとを論理積演算した結果により、前記マスタマスクを更新する、
請求項５に記載のデータ処理装置。
【請求項７】
前記入力データからソート対象のデータを絞り込み、前記絞り込み結果に応じて前記マスタマスクを更新する絞り込み部を備える、
請求項４乃至６のいずれか一項に記載のデータ処理装置。
【請求項８】
前記絞り込み部は、前記複数のスキャンデータに対し前記ビットスキャン処理を行うことで、前記入力データから所定の範囲のデータを抽出する、
請求項７に記載のデータ処理装置。
【請求項９】
前記マスク処理の結果をスタックするスタック部をさらに備え、
前記スキャンダウン部は、前記スタックされたマスク結果に対応するビット位置から前記スキャンダウン処理を開始する、
請求項４乃至８のいずれか一項に記載のデータ処理装置。
【請求項１０】
前記取得されたスキャンデータを複数の分割スキャンデータに分割する分割部をさらに備え、
前記スキャンダウン部は、前記分割スキャンデータごとに前記スキャンダウン処理を行う、
請求項１乃至９のいずれか一項に記載のデータ処理装置。
【請求項１１】
前記スキャンダウン部は、前記入力データを昇順にソートするスキャンダウン処理と、前記入力データを降順にソートするスキャンダウン処理とを並列に行う、
請求項１乃至１０のいずれか一項に記載のデータ処理装置。
【請求項１２】
前記スキャンダウン処理の結果と前記複数のスキャンデータとをマスクした結果のビットをビットカウントするビットカウント部と、
前記ビットカウントの結果に応じた値を積算する積算部と、をさらに備える、
請求項１乃至１１のいずれか一項に記載のデータ処理装置。
【請求項１３】
前記スキャンダウン部は、複数のテーブルから取得されるスキャンデータに対しスキャンダウン処理を行い、
前記スキャンダウン処理によるソート結果に基づいて、前記複数のテーブルのＪＯＩＮ処理を行うＪＯＩＮ処理部をさらに備える、
請求項１乃至１２のいずれか一項に記載のデータ処理装置。
【請求項１４】
データ処理装置がデータを処理する方法であって、
複数のＮビットの入力データにおける同じビット位置のビットデータを含むスキャンデータを、ビット位置順に取得し、
前記取得されるスキャンデータを用いてマスクデータにマスクをかけるマスク処理と前記マスク処理の結果に応じた前記マスクデータの更新処理とを含むビットスキャン処理を行い、前記第１のビット位置のスキャンデータから前記第Ｎのビット位置のスキャンデータまで前記ビットスキャン処理を繰り返すスキャンダウン処理を行い、
前記スキャンダウン処理ごとに得られる同値の前記入力データをソート順に逐次出力する、
データ処理方法。
【請求項１５】
複数のＮビットの入力データにおける同じビット位置のビットデータを含むスキャンデータを、ビット位置順に取得し、
前記取得されるスキャンデータを用いてマスクデータにマスクをかけるマスク処理と前記マスク処理の結果に応じた前記マスクデータの更新処理とを含むビットスキャン処理を行い、前記第１のビット位置のスキャンデータから前記第Ｎのビット位置のスキャンデータまで前記ビットスキャン処理を繰り返すスキャンダウン処理を行い、
前記スキャンダウン処理ごとに得られる同値の前記入力データをソート順に逐次出力する、
処理をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ処理装置、データ処理方法、及びプログラムに関する。
【背景技術】
【０００２】
近年、ＩＴ（Information Technology）技術の発達及び世界的な普及に伴い、データベースを含む各種ＩＴシステムが処理するデータ量が急増している。今後もＩｏＴ（Internet of Things）の推進や５Ｇの普及等により、全世界のデータ量はさらに爆発的に増加すると予測されている。このため、データ処理技術の飛躍的な向上が望まれている。
【０００３】
関連する技術として、例えば、特許文献１及び２、非特許文献１及び２が知られている。特許文献１には、情報の読み出し書き込みが可能なメモリにおいて、１ワードビット幅がＮでＭワードアドレスの記憶セル構造とし、Ｍワードアドレスの中から繰り返し選択指定される１ワードビット幅がＮの記憶セル情報を１組Ｎビットの論理演算器に並列に入力し論理演算することで、大容量メモリを連想メモリ（ＣＡＭ）に匹敵する情報検索能力を持った能動型のメモリを実現する技術が記載されている。特許文献２にも、特許文献１と同様の構造を有するメモリ型プロセッサが記載されている。なお、特許文献１及び２のようなメモリ型プロセッサをデータベースプロセッサ（ＤＢＰ）と呼ぶ場合がある。
【０００４】
また、非特許文献１及び２には、メインメモリで高速なスキャンを実現するため、ビットレベルで並列処理を可能とするＢｉｔＷｅａｖｉｎｇと呼ばれる技術が記載されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１７−１６６６８号公報
【特許文献２】特開２０１８−１３９０１７号公報
【非特許文献】
【０００６】
【非特許文献１】Yinan Li, Jignesh M. Patel, "BitWeaving: Fast Scans for Main Memory Data Processing", SIGMOD '13: Proceedings of the 2013 ACM SIGMOD International Conference on Management of Data, June 2013, Pages 289-300, [online], [令和３年７月５日検索], インターネット<URL:http://pages.cs.wisc.edu/~jignesh/publ/BitWeaving.pdf>
【非特許文献２】Yinan Li, Jignesh M. Patel, "CS564, BitWeaving: Fast Scans for Main Memory Data Processing", University of Wisconsin-Madison, [online], [令和３年７月５日検索], インターネット<URL:http://pages.cs.wisc.edu/~jignesh/cs564/rl/bitweaving.pdf>
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上記のような、関連する技術におけるＤＢＰやＢｉｔＷｅａｖｉｎｇでは、メモリのデータをビット単位に並列処理することにより検索処理の高速化を可能とし得る。しかしながら、関連する技術では、データ処理として主に検索処理を対象としており、グルーピング処理などその他のデータ処理が考慮されていない。このため、データ処理の内容によっては効率的に処理を行うことが困難な場合がある。
【０００８】
本発明は、このような事情に鑑みてなされたものであって、効率よくデータ処理を行うことが可能なデータ処理装置、データ処理方法、及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明に係るデータ処理装置は、複数のＮビットの入力データにおける同じビット位置のビットデータを含むスキャンデータを、ビット位置順に取得する取得部と、前記取得されるスキャンデータを用いてマスクデータにマスクをかけるマスク処理と前記マスク処理の結果に応じた前記マスクデータの更新処理とを含むビットスキャン処理を行い、前記第１のビット位置のスキャンデータから前記第Ｎのビット位置のスキャンデータまで前記ビットスキャン処理を繰り返すスキャンダウン処理を行うスキャンダウン部と、前記スキャンダウン処理ごとに得られる同値の前記入力データをソート順に逐次出力する出力部と、を備えるものである。
【００１０】
本発明に係るデータ処理方法は、データ処理装置がデータを処理する方法であって、複数のＮビットの入力データにおける同じビット位置のビットデータを含むスキャンデータを、ビット位置順に取得し、前記取得されるスキャンデータを用いてマスクデータにマスクをかけるマスク処理と前記マスク処理の結果に応じた前記マスクデータの更新処理とを含むビットスキャン処理を行い、前記第１のビット位置のスキャンデータから前記第Ｎのビット位置のスキャンデータまで前記ビットスキャン処理を繰り返すスキャンダウン処理を行い、前記スキャンダウン処理ごとに得られる同値の前記入力データをソート順に逐次出力するものである。
【００１１】
本発明に係るプログラムは、複数のＮビットの入力データにおける同じビット位置のビットデータを含むスキャンデータを、ビット位置順に取得し、前記取得されるスキャンデータを用いてマスクデータにマスクをかけるマスク処理と前記マスク処理の結果に応じた前記マスクデータの更新処理とを含むビットスキャン処理を行い、前記第１のビット位置のスキャンデータから前記第Ｎのビット位置のスキャンデータまで前記ビットスキャン処理を繰り返すスキャンダウン処理を行い、前記スキャンダウン処理ごとに得られる同値の前記入力データをソート順に逐次出力する、処理をコンピュータに実行させるためのプログラムである。
【発明の効果】
【００１２】
本発明によれば、効率よくデータ処理を行うことが可能なデータ処理装置、データ処理方法、及びプログラムを提供することができる。
【図面の簡単な説明】
【００１３】
【図１】実施の形態１に係るデータ処理装置の構成例を示す構成図である。
【図２】実施の形態１に係る記憶部のメモリセル構造の例を示す図である。
【図３】実施の形態１に係るデータ処理方法の一例を示すフローチャートである。
【図４】実施の形態１に係るデータ処理方法の他の例を示すフローチャートである。
【図５Ａ】実施の形態１に係るデータ処理の動作例を示す図である。
【図５Ｂ】実施の形態１に係るデータ処理の動作例を示す図である。
【図６】実施の形態１に係るデータ処理方法の別の例を示すフローチャートである。
【図７Ａ】実施の形態１に係るデータ処理の動作例を示す図である。
【図７Ｂ】実施の形態１に係るデータ処理の動作例を示す図である。
【図８】実施の形態２に係るデータ処理装置の構成例を示す構成図である。
【図９Ａ】実施の形態２に係るデータ処理の動作例を示す図である。
【図９Ｂ】実施の形態２に係るデータ処理の動作例を示す図である。
【図１０】実施の形態３に係るデータ処理装置の構成例を示す構成図である。
【図１１】実施の形態３に係るデータ処理方法の一例を示すフローチャートである。
【図１２】実施の形態３に係るデータ処理の動作例を示す図である。
【図１３】実施の形態３に係るデータ処理方法の他の例を示すフローチャートである。
【図１４】実施の形態３に係るデータ処理の動作例を示す図である。
【図１５】実施の形態３の変形例に係るデータ処理方法の一例を示すフローチャートである。
【図１６Ａ】実施の形態３の変形例に係るデータ処理の動作例を示す図である。
【図１６Ｂ】実施の形態３の変形例に係るデータ処理の動作例を示す図である。
【図１７Ａ】実施の形態３の変形例に係るデータ処理の他の動作例を示す図である。
【図１７Ｂ】実施の形態３の変形例に係るデータ処理の他の動作例を示す図である。
【図１８】実施の形態４に係るデータ処理装置の構成例を示す構成図である。
【図１９Ａ】実施の形態４に係るデータ処理の動作例を示す図である。
【図１９Ｂ】実施の形態４に係るデータ処理の動作例を示す図である。
【図２０】実施の形態５に係るデータ処理装置の構成例を示す構成図である。
【図２１Ａ】実施の形態５に係るデータ処理の動作例を示す図である。
【図２１Ｂ】実施の形態５に係るデータ処理の動作例を示す図である。
【図２２】実施の形態６に係るデータ処理装置の構成例を示す構成図である。
【図２３】実施の形態６に係るデータ処理方法の一例を示すフローチャートである。
【図２４Ａ】実施の形態６に係るデータ処理の動作例を示す図である。
【図２４Ｂ】実施の形態６に係るデータ処理の動作例を示す図である。
【図２５】実施の形態６に係るデータ処理の効果を説明するための図である。
【図２６】実施の形態７に係るデータ処理装置の構成例を示す構成図である。
【図２７】実施の形態７に係るデータ処理方法の一例を示すフローチャートである。
【図２８】実施の形態７に係るデータ処理の動作例を示す図である。
【図２９】実施の形態７に係るデータ処理の他の動作例を示す図である。
【図３０】実施の形態８に係るデータ処理装置の構成例を示す構成図である。
【図３１】実施の形態８に係るデータ処理方法の一例を示すフローチャートである。
【図３２】実施の形態８に係るデータ処理の動作例を示す図である。
【発明を実施するための形態】
【００１４】
以下、図面を参照して本発明の実施の形態について説明する。ただし、本発明が以下の実施の形態に限定される訳ではない。また、説明を明確にするため、以下の記載および図面は、適宜、省略、および簡略化がなされている。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００１５】
（関連する技術の検討）
実施の形態の理解を助けるため、データベースのデータ処理について検討する。データベースの処理は大別すると、大量なデータの中から対象データを絞り込む検索処理と、その結果を分類する集約処理に分けられる。一般的なデータベースでは、前者を高速に行うためにインデックスを使用し、後者を高速に行うためにハッシュやＳＯＲＴなどの処理を組み合わせている。
【００１６】
検索については、特許文献１及び２に記載されたようなＤＢＰ（超並列演算装置）を使うことで、インデックスを使わずに高速動作が可能になる。しかしながら、特許文献１及び２、非特許文献１及び２には、その検索結果に対する集約の操作については示されていない。
【００１７】
そこで、集約処理について検討する。集約の種類としては、集合の中から同値のものを集めるグルーピング（ＧＲＯＵＰ  ＢＹ）処理、２つの集合を特定のキーによって結合する（ＪＯＩＮ）処理が代表的である。また、集合の中から同値のものを排除し、ユニークな集合を得る重複排除（ＤＩＳＴＩＮＣＴ）処理、集合をあるキーで昇順もしくは降順に並べ替えるソート（ＯＲＤＥＲ  ＢＹ）処理も集約処理に含まれ得る。一般的なデータベースでは、この集約を行うための方法として、上記のようにＳＯＲＴやハッシュが使われる。また、結合（ＪＯＩＮ）処理では、インデックスを使った検索処理の応用として一件ずつ順次結合先を探すネステッドループＪＯＩＮも行われる。
【００１８】
ソート方式では、データに対して一旦、グルーピングキーでソートを行い、その結果に対し、同値の範囲をグルーピングしていく。ハッシュ方式の場合は、グルーピングキーに対し、まずハッシュ値を求めて、そのハッシュ値に従ったブロックにデータを分散させる。ただし、ハッシュ値は異なるキーに対して、同じハッシュ値が生成される（ハッシュ値の衝突）ことがあるため、同じハッシュブロックの中に異なるグルーピングキーのデータが入る場合は、それらを更に別々のブロックに分散させる。こうすることで、末端のブロックには同じグルーピングキーを持つデータを集めることができる。
【００１９】
関連する技術では、これらの処理について、コンピュータの持つ基本的な処理単位であるワードなどの単位でデータを一件ずつ処理していく。これに対し、以下に説明するように、本発明の実施の形態における集約処理（グルーピング処理）では、複数のデータに対して同時に処理を行い、集約データ（グルーピングデータ）を順次抽出していく。このように、実施の形態では、関連する技術とは異なった処理方式を取るため、その処理特性においても、関連する技術とは異なった特性を得ることが可能となる。例えば、関連する技術が得意な分野と本発明の実施の形態が得意な分野を処理の内容によって使い分けることで、双方の長所を生かして大幅な処理の効率化を図ることも可能となる。
【００２０】
（実施の形態１）
次に、実施の形態１について説明する。本実施の形態では、本発明の基本的な例として、ビットスキャンを含むスキャンダウンによる基本グルーピングソート処理について説明する。
【００２１】
＜データ処理装置の構成＞
図１は、本実施の形態に係るデータ処理装置の構成例を示している。本実施の形態に係るデータ処理装置１００は、データ処理の一例として、入力データに対しグルーピングソート処理を行う。なお、本来データベースにおけるグルーピング処理では、グルーピングの結果は、あくまで同一のものを集約したデータを得ることで、その順序性については規定が無い。しかしながら、本件のグルーピング処理では、グルーピングとソートが同時に行われ、ソートの結果にグルーピングデータを含む形式になる。このため、以降の説明での本件のグルーピングを「グルーピングソート」と呼ぶ。図１に示すように、データ処理装置１００は、記憶部１１０、取得部１２０、マスク保持部１３０、スキャンダウン部１４０、出力部１５０を備えている。なお、図１の構成は一例であり、本実施の形態に係るデータ処理が可能であれば、その他の構成としてもよい。また、データ処理装置１００は、一つの装置でもよいし、複数の装置でもよい。
【００２２】
記憶部１１０は、入力される複数の入力データを記憶する。入力データは、データ処理装置１００が処理する処理対象のデータである。例えば、記憶部１１０は、入力データのビット幅と入力データのレコード数に応じた所定のメモリセル構造のメモリである。例えば、記憶部１１０は、特許文献１及び２のようなＤＢＰと同様のメモリセル構造のメモリであるか、その他の構造のメモリでもよいし、メモリに限らずその他の任意の記憶手段でもよい。図２は、記憶部１１０のメモリセル構造の一例を示している。例えば、入力データの１レコード（１ワード）がＮ（Ｎ＞０の整数）ビットであり、Ｍ（Ｍ＞０の整数）レコードの入力データが入力される場合、図２に示すように、記憶部１１０をＭ行×Ｎ列のメモリセル構造とし、各行に各入力データを格納する。
【００２３】
取得部１２０は、記憶部１１０が記憶する複数の入力データからスキャンダウン部１４０が処理するスキャンデータをビット列順（ビット位置順）に選択し取得する。スキャンデータは、複数の入力データにおける同じビット位置のビットデータを含むデータである。取得部１２０は、例えば図２に示すように、ＭレコードのＮビットデータにおいて、各レコードの同じビット位置のビットデータをビット列単位に選択し、選択したＭ個のビットデータをレコード順（入力順）に抽出して、スキャンデータを取得する。すなわち、ＭレコードのＮビットデータが入力される場合、ＭビットのスキャンデータがＮ個取得される。また、取得部１２０は、ＭレコードのＮビットデータに対し、ビット列順に第１ビット列から第Ｎビット列へデータ検索方向（スキャンダウン方向）にスキャンデータを取得する。データ検索方向は、スキャンダウン部１４０によりスキャンダウン処理が行われる処理順に応じた方向であり、ＭＳＢ（Most Significant Bit）からＬＳＢ（Least Significant Bit）へ向かう方向であるが、処理の内容によってはＬＳＢからＭＳＢへ向かう方向としてもよいし、処理の内容に応じた特別な順序でも良い。
【００２４】
マスク保持部１３０は、スキャンダウン部１４０がスキャンダウン処理で使用するマスタマスクを保持（記憶）する。マスタマスクは、複数の入力データからスキャンダウン処理の対象となるソート対象（レコード）を特定するデータである。また、マスタマスクは、スキャンダウン部１４０によって行われるスキャンダウン処理の結果により更新され、次の処理への有効データの引継ぎに使われる。例えば、マスタマスクは、対象データをＯＮビット（有効ビット）のビット位置で示す。全データ（レコード）をソートする場合、マスタマスクは全ビットがＯＮとなる。また、特定のレコードのみを処理対象としたい場合は、該当するレコード位置のビットのみＯＮに設定することで、処理対象を自由に設定できる。
【００２５】
スキャンダウン部１４０は、取得部１２０が取得したスキャンデータに対しビットスキャン処理を含むスキャンダウン処理を行う。スキャンダウン部１４０は、各スキャンデータに対しビットスキャン処理を行うビットスキャン部でもあり、第１のビット位置のスキャンデータから第Ｎのビット位置のスキャンデータまでビットスキャン処理を繰り返すスキャンダウン処理を行う。これにより、入力データを昇順または降順にソートする。この際、ビットスキャン処理の特性により、対象データの中に複数の同じ値を持つレコードが存在する場合は、それら複数レコードの検出が同時に行われる。ソートをした上で、グルーピング処理も同時に行うため、この処理をグルーピングソート処理とも呼び、特に本実施の形態のソート処理を基本グルーピングソート処理と呼ぶ場合がある。ビットスキャン処理は、スキャンデータを用いてマスクデータに対してマスクをかけるマスク処理とマスク処理の結果に応じたマスクデータの更新処理とを含む。例えば、スキャンダウン部１４０は、マスク処理を行うマスク処理部とマスクデータを更新するマスクデータ更新処理部を含んでいてもよい。スキャンダウン部１４０は、入力データを昇順にソートする場合、マスクデータに対しスキャンデータの反転データを使ってマスク(ＡＮＤＮｏｔ)をかけ、前記入力データを降順にソートする場合、マスクデータに対しスキャンデータをそのまま使ってマスク(ＡＮＤ：論理積)をかける。
【００２６】
また、スキャンダウン部１４０は、マスク保持部１３０に保持されたマスタマスクをマスク処理に用いるマスクデータの初期値として、Ｎ個のスキャンデータに対するスキャンダウン処理（一巡のビットスキャン処理）を開始する。これにより、マスタマスクに対応するソート対象のデータ（レコード）の最小値（昇順の場合）または最大値（降順の場合）のデータを得る。スキャンダウン処理は、第１のビット列（例えばＭＳＢ）のスキャンデータから第Ｎのビット列（例えばＬＳＢ）のスキャンデータまで繰り返されるビットスキャン処理を含み、全てのデータのソート（スキャン）が完了するまでこのスキャンダウン処理を繰り返す。
【００２７】
スキャンダウン部１４０は、Ｎ個のスキャンデータに対するスキャンダウン処理の終了ごとに、スキャンダウン処理の結果に応じてマスタマスクを更新する。例えば、マスタマスクの更新では、現在のマスタマスクとスキャンダウン処理の結果の反転データ（ＮＯＴ）をＡＮＤ演算した結果により、マスタマスクを更新する。こうして更新されたマスタマスクは次のスキャンダウン処理によるソート対象となる。すなわち、マスタマスクを更新することにより、スキャン処理結果として出力された（同値として検索された）データを除いて、次のスキャンダウン処理で処理するデータ（レコード）を絞り込む。全てのデータがスキャン処理結果として出力された場合、すなわち更新されたマスタマスクが０となった場合、全データに対するスキャンが完了したため、スキャンダウン処理を終了する。
【００２８】
出力部１５０は、スキャンダウン部１４０によるスキャンダウン処理の結果を所定のデータ処理結果として出力する。本実施の形態では、スキャンダウン処理により得られる昇順または降順の同値データのソート結果を、入力データをグルーピングソート処理した結果（グルーピングソートデータ）として出力する。すなわち、スキャンダウン処理では、同値のデータ（レコード）を同時に検索できるため、ソートの結果には、同時に検索された同値のデータ群が同じグループとしてグルーピングされて出力される。換言すると、出力部１５０は、スキャンダウン処理ごとに得られる同値の入力データをソート順に逐次出力する。つまり、出力部１５０は、Ｎ個のスキャンデータに対するスキャンダウン処理が終了する毎に1グループずつグルーピング結果を出力することが出来る。これは関連する技術によるグルーピング処理には無い特性になる。当然ながら、内部にデータを蓄積し、全データのソート（スキャン）が完了したときに全てのグルーピング結果をまとめて出力してもよい。なお、グルーピング処理に限らず、同値のデータを集約する処理を含む、任意の集約処理に適用してもよい。
【００２９】
＜昇順の基本グルーピングソート処理の処理フロー＞
図３は、本実施の形態に係るデータ処理方法のフローチャートの一例を示している。図３は、スキャンダウンによる基本グルーピングソート処理を昇順に行う場合の例である。例えば、以下の処理は主にスキャンダウン部１４０により実行され、結果の出力処理が出力部１５０により実行されるが、これに限られない。
【００３０】
図３に示すように、まず、データ処理装置１００は、スキャンダウン処理の初期設定として、変数Ａにマスタマスク（Ｍａｓｋ）を設定し、変数ＰにＭＳＢ位置を設定する（Ｓ１０１）。例えば、マスタマスクの初期値は全ビットがＯＮである。変数Ａは、処理対象のスキャンデータにより、マスクを更新することで、データを絞り込んでいくマスクデータである。変数Ｐは、取得（処理）するスキャンデータのビット列を示し、Ｎ個のスキャンデータから処理対象のスキャンデータを特定する。
【００３１】
次に、データ処理装置１００は、ビットスキャン処理に含まれるマスク処理として、この例では昇順にソートするため、Ｐビット列のスキャンデータのＮＯＴ（論理否定）演算結果とマスクデータである変数ＡとをＡＮＤ（論理積）演算し、そのＡＮＤ演算結果を変数Ｂに設定する（Ｓ１０２）。変数Ｂは、スキャンデータによってマスクデータに対してマスクをかけたマスク処理結果である。
【００３２】
次に、データ処理装置１００は、マスク処理結果である変数Ｂが０か否か、すなわち、変数Ｂの全ビットがＯＦＦか否か判定する（Ｓ１０３）。変数Ｂが０の場合は、Ｐビット列のスキャンデータによるマスク処理の結果、絞り込みの結果として残るデータが無いことを示す。このため、変数Ｂが０になる場合は、絞り込み失敗として、絞り込み結果を示すマスクデータである変数Ａを更新しない。逆に、Ｓ１０３で変数Ｂが０以外の場合、すなわち、変数ＢのいずれかのビットがＯＮの場合は、絞り込みが成功したことを示し、この場合は、絞り込み結果を示すマスクデータである変数Ａを変数Ｂにより更新する（Ｓ１０４）。
【００３３】
次に、データ処理装置１００は、処理中のビット列である変数ＰがＬＳＢか否か、すなわち、全ビットのスキャン（スキャンダウン処理）が終了したか否かを判定する（Ｓ１０５）。
【００３４】
Ｓ１０５で変数ＰがＬＳＢ以外の場合、すなわち、全ビットのスキャンが終了していない場合、データ処理装置１００は、次のスキャンのために、変数ＰをＬＳＢ側に一つ（１ビット）移動し（Ｓ１０６）、Ｓ１０２以降で次のビット列に対するビットスキャン処理を繰り返す。
【００３５】
また、Ｓ１０５で変数ＰがＬＳＢである場合、すなわち、全ビットのスキャンが終了した場合、Ｓ１０４で更新されたマスクデータ（０以外のマスク処理結果）である変数Ａを出力する（Ｓ１０７）。この処理結果のうち、ビットがＯＮの位置が、マスタマスクで指定された対象データにおける最小値のレコード位置を示しており、本実施の形態では、これを同値データのグルーピング結果として出力する。
【００３６】
次に、データ処理装置１００は、マスタマスクとマスクデータである変数Ａの反転データ（ＮＯＴ）をＡＮＤ演算し、その結果によりマスタマスクを更新する（Ｓ１０８）。この処理により、マスタマスクの中のＯＮビット（処理対象のレコード位置に対応）のうち、今回の出力によって既に処理が完了したデータに対するレコード位置のビットがＯＦＦになる。なお、この処理にはマスタマスクとマスクデータである変数Ａの排他的論理和（ＸＯＲ）演算を使っても良い。次に、データ処理装置１００は、更新したマスタマスクが０か否か、すなわち、全データ処理（ソート処理）が終了したか否かを判定する（Ｓ１０９）。Ｓ１０９でマスタマスクが０以外の場合、すなわち、まだ処理すべきデータが残っている場合は、Ｓ１０１以降でスキャンダウン処理を繰り返す。また、Ｓ１０９でマスタマスクが０の場合、すなわち、全データ処理が終了した場合、処理を終了する。
【００３７】
図４は、本実施の形態に係るデータ処理方法のフローチャートの他の例を示している。図４は、図３に示したスキャンダウンによる基本グルーピングソート処理において、さらに、処理結果を早期検出する例である。
【００３８】
図４の例では、Ｓ１０４でマスクデータである変数Ａを変数Ｂにより更新した後、更新されたマスクデータ（０以外のマスク処理結果）である変数ＡのＯＮビットが一つのみか否かを判定する（Ｓ１１０）。Ｓ１１０で変数ＡのＯＮビットが一つのみではない場合は、更に絞り込みを行える可能性があるため、Ｓ１０５に進み全ビットのスキャンが終了したか否か判定する。一方、Ｓ１１０で変数ＡのＯＮビットが一つのみの場合は、それ以上の絞り込みが不可能なため、Ｓ１０７に進み、マスクデータ（マスク処理結果）である変数Ａを出力する。このように、マスク処理結果のＯＮビットが１つとなった場合は、この時点で対象のレコードが1つに絞られ、処理結果が求まっている。このため、図４のように、１ビットだけがＯＮとなるマスク処理結果を検出することで、最終ビット（ＬＳＢ）までスキャンすることなく処理結果を求めることができ、処理ステップを削減できる。
【００３９】
＜昇順の基本グルーピングソート処理の動作例＞
図５Ａ及び図５Ｂは、本実施の形態に係るデータ処理の動作例を示している。図５Ａ及び図５Ｂは、図３に示したようにスキャンダウンによる基本グルーピングソート処理を昇順に行う場合の例である。
【００４０】
図５Ａ及び図５Ｂの例では、レコード番号（ＲｅｃＮｏ）０〜５の６レコードのデータが入力される。レコード番号０のデータ値が９、レコード番号１のデータ値が６、レコード番号２のデータ値が３、レコード番号３のデータ値が６、レコード番号４のデータ値が９、レコード番号５のデータ値が６である。各データは４ビットデータであり、各データのビット列（ビット位置）を［０］〜［３］（ＬＳＢ〜ＭＳＢ）とする。また、スキャンデータ及びマスクデータはレコード数である６ビットとなる。
【００４１】
図５Ａに示すように、４個のスキャンデータに対し１回目のスキャンダウン処理を行う。１回目のスキャンダウン処理では、マスタマスクの初期値は、“１１１１１１”であり（Ｓ２０１）、全データ（レコード番号０〜５）がソート対象となる。
【００４２】
１回目のスキャンダウン処理では、まず、ビット列［３］（ＭＳＢ）のスキャンデータを使いビットスキャン処理を行う。具体的には、マスタマスク“１１１１１１”をマスクデータとして、ビット列［３］のスキャンデータ“１０００１０”をＮＯＴ演算した結果の“０１１１０１”をマスクにかけることで、マスク結果は“０１１１０１”となる（Ｓ２０２）。
【００４３】
次に、ビット列［２］のスキャンデータを使いビットスキャン処理を行う。具体的には、ビット列［３］のマスク結果“０１１１０１”をマスクデータとして、ビット列［２］のスキャンデータ“０１０１０１”をＮＯＴ演算した結果“１０１０１０”をマスクにかけ、マスク結果は“００１０００”となる（Ｓ２０３）。
【００４４】
次に、ビット列［１］のスキャンデータを使いビットスキャン処理を行う。具体的には、ビット列［２］のマスク結果“００１０００”をマスクデータとしてビット列［１］のスキャンデータ“０１１１０１”をＮＯＴ演算した結果“１０００１０”をマスクにかけ、マスク結果はオール０（“００００００”）となる（Ｓ２０４）。このように、マスク結果がすべて０に成ってしまう場合は、前記フローチャートのＳ１０３の判定の通り、マスク結果の更新は行わず、直前の有効なマスクであるビット列［２］のマスク結果である“００１０００”を次の処理のマスクとして引き継ぐ。
【００４５】
次に、ビット列［０］（ＬＳＢ）のスキャンデータを使いビットスキャン処理を行う。この前の処理で、ビット位置［１］のマスク結果が０であったため、引き継いだビット列［２］のマスク結果“００１０００”をマスクデータとして、ビット列［０］のスキャンデータ“１０１０１０”をＮＯＴ演算した結果“０１０１０１”をマスクにかけ、マスク結果はオール０となる（Ｓ２０５）。ここでも同様に、マスク結果がすべて０に成ってしまうため、マスク結果の更新は行わず、直前の有効なマスクであるビット列［２］のマスク結果である“００１０００”を次の処理のマスクとして引き継ぐ。
【００４６】
次に、１回目のスキャンダウン処理が終了したため、処理結果を出力する。具体的には、直前で引き継いだマスク結果である“００１０００”を１回目のスキャンダウン処理の結果として出力する（Ｓ２０６）。すなわち、“００１０００”のＯＮビットに対応するレコード番号２のデータが最小値のデータ（第１のグルーピング結果）となる。
【００４７】
次に、１回目のスキャンダウン処理結果によりマスタマスクを更新する。具体的には、現在のマスタマスク“１１１１１１”に対し、１回目のスキャンダウン処理結果をＮＯＴ演算した値である“１１０１１１”でマスクをかけ、そのマスク結果“１１０１１１”を次の２回目のスキャンダウン用の新しいマスタマスクとする（Ｓ２０７）。なお、この演算は、図３のフローチャートのＳ１０８で示すように、現在のマスタマスク“１１１１１１”と１回目のスキャンダウン処理結果“００１０００”をＸＯＲ演算した結果でも同じである。
【００４８】
次に、２回目のスキャンダウン処理を行う。２回目のスキャンダウン処理では、新しいマスタマスク“１１０１１１”を用いて（Ｓ２１１）、レコード番号０、１、３、４、５のデータをソート対象として、４個のスキャンデータを使ってビットスキャン処理を行う。１回目のスキャンダウン処理と同様に、ビット列［３］のスキャンデータを使いビットスキャン処理を行うと、マスク結果は“０１０１０１”となり（Ｓ２１２）、ビット列［２］のスキャンデータを使いビットスキャン処理を行うと、マスク結果はオール０となり（Ｓ２１３）、ビット列［１］のスキャンデータを使いビットスキャン処理を行うと、マスク結果はオール０となり（Ｓ２１４）、ビット列［０］のスキャンデータを使いビットスキャン処理を行うと、マスク結果は“０１０１０１”となる（Ｓ２１５）。細かな説明は省略しているが、1回目同様、ビットスキャンの結果がすべて０に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行う。
【００４９】
この結果２回目のスキャンダウン処理の結果は、ビット列［０］のマスク結果“０１０１０１”となる（Ｓ２１６）。すなわち、“０１０１０１”のＯＮビットのレコード番号１、３、５に対応するデータが２番目に小さいデータ（第２のグルーピング結果）として出力される。また、現在のマスタマスク“１１０１１１”と２回目のスキャンダウン処理結果をＮＯＴ演算した結果“１０１０１０”とをマスクし、次の３回目のスキャンダウン用の新しいマスタマスクを“１０００１０”とする（Ｓ２１７）。
【００５０】
次に、３回目のスキャンダウン処理を行う。３回目のスキャンダウン処理では、新しいマスタマスク“１０００１０”を用いて（Ｓ２２１）、レコード番号０、４のデータをソート対象として、４個のスキャンデータを使ってビットスキャン処理を行う。１回目のスキャンダウン処理と同様に、ビット列［３］のスキャンデータを使いビットスキャン処理を行うと、マスク結果はオール０となり（Ｓ２２２）、ビット列［２］のスキャンデータを使いビットスキャン処理を行うと、マスク結果は“１０００１０”となり（Ｓ２２３）、ビット列［１］のスキャンデータを使いビットスキャン処理を行うと、マスク結果は“１０００１０”となり（Ｓ２２４）、ビット列［０］のスキャンデータを使いビットスキャン処理を行うと、マスク結果はオール０となる（Ｓ２２５）。２回目同様、ビットスキャンの結果がすべて０に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行う。
【００５１】
３回目のスキャンダウン処理の結果は、ビット列［０］のマスク結果が０であるため、ビット列［１］のマスク結果“１０００１０”を引き継いだものとなる（Ｓ２２６）。すなわち、“１０００１０”のＯＮビットのレコード番号０、４に対応するデータが３番目に小さいデータ（第３のグルーピング結果）として出力される。また、現在のマスタマスク“１０００１０”と３回目のスキャンダウン処理の結果をＮＯＴ演算した結果“０１１１０１”をマスクすると結果が“００００００”となり、全ビットがＯＦＦのため、処理を終了する（Ｓ２２７）。
【００５２】
図５Ａ及び図５Ｂに示すように、各スキャンダウン処理の結果において、同値のレコード（データ）については同時に該当するビットがＯＮとなるため、スキャンダウン処理の結果を同値のグルーピング結果として出力する。図５Ａ及び図５Ｂの例では、昇順のグルーピングソート処理の結果は、個数＝３、レコード番号＝(２），(１，３，５），（０，４）となる。
【００５３】
なお、グルーピング結果（ビットスキャン処理の結果）のＯＮビットの個数を数えることで、グループに属するレコードのカウント値を取得（出力）してもよい。また、グルーピング結果を使い、それらの該当するレコードの特定の要素（データ値）を加算することで合計を求めてもよいし、その合計をグループに属するレコード件数で割ることで平均を求めてもよい。さらに、グルーピングの結果から、各々一つのみのデータを抽出することで、重複排除の結果（ユニーク値の集合）を取得してもよい。
【００５４】
＜降順の基本グルーピングソート処理の処理フロー＞
図６は、本実施の形態に係るデータ処理方法のフローチャートの別の例を示している。図６は、スキャンダウンによる基本グルーピングソート処理を降順に行う場合の例である。図６の例では、図３の昇順のフローチャートに対し、Ｓ１０２ａの処理のみが異なる。すなわち、Ｓ１０２ａにおいて、マスク処理として、降順にソートするため、マスクデータである変数ＡとＰビット列のスキャンデータをそのままＡＮＤ演算し、そのＡＮＤ演算結果を変数Ｂに設定する。
【００５５】
＜降順の基本グルーピングソート処理の動作例＞
図７Ａ及び図７Ｂは、本実施の形態に係るデータ処理の他の動作例を示している。図７Ａ及び図７Ｂは、図６に示したようにスキャンダウンによる基本グルーピングソート処理を降順に行う場合の例である。図７Ａ及び図７Ｂの例では、図５Ａ及び図５Ｂと同じデータが入力される。
【００５６】
図７Ａに示すように、図５Ａと同様、マスタマスク“１１１１１１により、１回目のスキャンダウンを行う（Ｓ３０１）。ビット列［３］のビットスキャン処理では、マスタマスク“１１１１１１”をマスクデータとして、ビット列［３］のスキャンデータ“１０００１０”をマスクにかけ、マスク結果が“１０００１０”となる（Ｓ３０２）。ビット列［２］のビットスキャン処理では、ビット列［３］のマスク結果“１０００１０”をマスクデータとして、ビット列［２］のスキャンデータ“０１０１０１”をマスクにかけ、マスク結果がオール０（“００００００”）となる（Ｓ３０３）。マスク結果がすべて０に成ってしまうため、前記図５Ａの昇順処理で示したＳ２０４同様、マスク結果の更新は行わず、直前の有効なマスクであるビット列［３］のマスク結果である“ １０００１０”を次の処理のマスクとして引き継ぐ。
【００５７】
ビット列［１］のビットスキャン処理では、引き継いだマスク結果“１０００１０”をマスクデータとして、ビット位置［１］のスキャンデータ“０１１１０１”をマスクにかけ、マスク結果がオール０となる（Ｓ３０４）。ここでもマスク結果がすべて０になるため、ビット列［３］のマスク結果“１０００１０”をマスクデータとして引き継ぎ、ビット列［０］のスキャンデータ“１０１０１０”をマスクにかけ、マスク結果が“１０００１０”となる（Ｓ３０５）。
【００５８】
１回目のスキャンダウン処理の結果は、ビット列［０］のマスク結果“１０００１０”となる（Ｓ３０６）。すなわち、“１０００１０”のＯＮビットのレコード番号０、４に対応するデータが最大値のデータ（第１のグルーピング結果）として出力される。また、現在のマスタマスク“１１１１１１”と１回目のスキャンダウン処理結果をＮＯＴ演算した結果“０１１１０１”とをマスクすることにより、次の２回目のスキャンダウン用の新しいマスタマスクを“０１１１０１”とする（Ｓ３０７）。
【００５９】
次に、２回目のスキャンダウン処理を行う。２回目のスキャンダウン処理では、新しいマスタマスク“０１１１０１”を用いて（Ｓ３１１）、レコード番号１、２、３、５のデータをソート対象として、１回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列［３］のスキャンデータのマスク結果はオール０となり（Ｓ３１２）、ビット列［２］のスキャンデータのマスク結果は“０１０１０１”となり（Ｓ３１３）、ビット列［１］のスキャンデータのマスク結果は“０１０１０１”となり（Ｓ３１４）、ビット列［０］のスキャンデータのマスク結果はオール０となる（Ｓ３１５）。なお、前記同様、ビットスキャンの結果がすべて０に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行う。
【００６０】
２回目のスキャンダウン処理の結果は、ビット列［０］のマスク結果が０であるため、ビット列［１］のマスク結果“０１０１０１”となる（Ｓ３１６）。すなわち、“０１０１０１”のＯＮビットのレコード番号１、３、５が２番目に大きいデータ（第２のグルーピング結果）として出力される。また、現在のマスタマスク“０１１１０１”と２回目のスキャンダウン処理結果をＮＯＴ演算した結果“１０１０１０”をマスクすることにより、次の３回目のスキャンダウン用の新しいマスタマスクを“００１０００”とする（Ｓ３１７）。
【００６１】
次に、３回目のスキャンダウン処理を行う。３回目のスキャンダウン処理では、新しいマスタマスク“００１０００”を用いて（Ｓ３２１）、レコード番号２のデータをソート対象として、１回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列［３］のスキャンデータのマスク結果はオール０となり（Ｓ３２２）、ビット列［２］のスキャンデータのマスク結果はオール０となり（Ｓ３２３）、ビット列［１］のスキャンデータのマスク結果は“００１０００”となり（Ｓ３２４）、ビット列［０］のスキャンデータのマスク結果は“００１０００”となる（Ｓ３２５）。ここでも、前記同様、、ビットスキャンの結果がすべて０に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行う。
【００６２】
３回目のスキャンダウン処理の結果は、ビット列［０］のマスク結果“００１０００”となる（Ｓ３２６）。すなわち、“００１０００”のＯＮビットのレコード番号２に対応するデータが３番目に大きいデータ（第３のグルーピング結果）として出力される。また、現在のマスタマスク“００１０００”と３回目のスキャンダウン処理結果をＮＯＴ演算した結果“１１０１１１”とのマスク結果が“００００００”となり、全ビットがＯＦＦのため、処理を終了する（Ｓ３２７）。図７Ａ及び図７Ｂの例では、降順のグルーピングソート処理の結果は、個数＝３、レコード番号＝（０，４），(１，３，５），(２）となる。
【００６３】
＜本実施の形態の効果＞
以上のように、本実施の形態における基本グルーピングソート処理では、ビットスキャン方向に対して直交する形で格納したデータのビットに対し、単純にＭＳＢを開始位置として、ＬＳＢ方向に対してデータをスキャンダウンしていくことにより、最終的なグルーピングデータを抽出することができる。また、この動作に、未処理データを示すマスタマスクを組み合わせ、スキャンダウンの結果をマスタマスクから減算し、マスタマスクの有効ビットが無くなるまで、ループ処理を繰り返すことにより、全グルーピングデータを順次抽出することができる。このような処理により、効率よく高速にグルーピング処理を行うことが可能となる。
【００６４】
特に、本実施の形態のグルーピング処理では、上記のように、処理対象のデータをＯＮビットの位置で示すマスタマスクを使用し、そのマスタマスクにより初期化されたマスクデータに対し、データの各ビット位置をＭＳＢからＬＳＢに向かって、降順ソートの場合はＡＮＤ演算を行い、昇順ソートの場合はＡＮＤＮｏｔ演算を行う。そして、この演算の途中で、マスクデータが０になる場合は、単純にその回の演算結果は捨てて、演算前のマスクデータを引き継ぐだけでよい。これにより、特許文献１及び２、非特許文献１及び２のような関連する技術と比べて、大幅に処理ステップ数を減らすことができる。そもそも、関連する技術には、グルーピング処理に関する記載もないため、本実施の形態のようにグルーピング処理に適用することはできない。
【００６５】
また、特許文献１及び２のような関連する技術では、各ビット位置が２のｎ乗に相当する値を持つことを前提としている。このため、ＢＣＤ（２進化１０進）コードを使用するような形態では処理が行えるが、ＢＣＤコードに変換できない浮動小数点のようなデータに対しては、同じ形で処理を行うことができない。例えば、浮動小数点数値（ＩＥＥＥ７５４形式）は、符号ビット、指数部、仮数部から構成されているため、関連する技術のロジックで使われている、特定のビットが２のｎ乗に相当するという理論は成立しない。しかしながら、浮動小数点数値では、符号ビットを除いた他のビットの配置は、より上位のビットが立っている数値は、ビットが立っていない数値に対して大きい値になるように設計されている。従って、スキャンダウンを使った本実施の形態の方式では論理に矛盾が生じることはなく、浮動小数点の最大、最小についても検出が可能になる。同様に、辞書式の文字列に対しても適用が可能になる。
【００６６】
さらに、本実施の形態でメモリに格納されるデータの横方向（１ワード）のビットサイズは、例えばＩｎｔｅｌ（登録商標）の最近のＣＰＵ（Central Processing Unit）を利用する場合であれば、一般のＩｎｔ系のデータの８ビット、１６ビット、３２ビット、６４ビットとすることができる。また、ＡＶＸと呼ぶＳＩＭＤ（Single Instruction/Multiple Data）命令で利用できる２５６ビットや５１２ビットとすることもでき、Ａｒｍ（登録商標）であればＮｅｏｎと呼ぶＳＩＭＤで利用できる１２８ビットとすることも可能である。また、特許文献１及び２のＤＢＰを利用する場合は、さらに大きなビット幅を使って処理することができる。加えて、最近利用が広まっているＧＰＧＰＵ（General-purpose computing on graphics processing units）についても、数千のコアに対しビット演算系の命令を使って処理を行うことで、ＧＰＧＰＵの並列処理の特性を生かした処理を行うことが可能である。一方、Java（登録商標）のような中間コードを経由して実行するような言語の場合は、ＳＩＭＤを有効に使うＶｅｃｔｏｒＡＰＩなどの手段を使うことで、実施が可能になる。さらに、既存のハードウェア上でソフトウェアによる演算ロジックとして動作が可能なことから、その内容をＦＰＧＡ（Field Programmable Gate Array）に組み込んで、ハードウェア的な回路として実施することも可能である。従って、本実施の形態は、モバイルを含む組み込み系から、大規模なクラスターを構成するクラウドシステムまで、ほぼ全てのコンピュータシステムに適用可能である。特にクラスター構成では、グルーピング結果がソート済みの状態で逐次出力されるため、上位の集約ノードでは、下位ノードのグルーピング結果を、単純なマージ処理によってまとめるだけで、全体のグルーピング結果についても、逐次出力を行うことが出来る。
【００６７】
（実施の形態２）
次に、実施の形態２について説明する。本実施の形態では、実施の形態１のデータ処理装置において、さらにデータ処理を中断及び再開する例について説明する。
【００６８】
＜データ処理装置の構成＞
図８は、本実施の形態に係るデータ処理装置の構成例を示している。図８に示すように、本実施の形態に係るデータ処理装置１００は、実施の形態１の構成に加えて、マスク退避部１３１を備えている。マスク退避部１３１は、スキャンダウン処理の中断時、マスク保持部１３０のマスタマスクを退避する。例えば、スキャンダウン処理結果により任意の数（指定件数）のデータが得られたときに、マスタマスクを退避して、処理を中断し、結果を出力してもよい。また、スキャンダウン処理の再開時、マスク退避部１３１に退避されたマスタマスクをマスク保持部１３０に回復し、回復したマスタマスクを用いて、スキャンダウン処理を行う。
【００６９】
＜昇順のソート処理の動作例＞
図９Ａ及び図９Ｂは、本実施の形態に係るデータ処理の動作例を示している。図９Ａ及び図９Ｂは、実施の形態１と同様にスキャンダウンによる基本グルーピングソート処理を昇順に行う際に、処理を中断し、その後、処理を再開する場合の例である。なお、ここではデータが単純にソートされる例を示すが、これに限らず、実施の形態１と同様にグルーピングソートすることが可能である。なお、以降の説明では、前記で示してきた、ビットスキャンの結果がすべて０に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行うという処理は、処理中に含まれているものとして説明する。
【００７０】
図９Ａ及び図９Ｂの例では、レコード番号０〜３の４レコードのデータが入力される。レコード番号０のデータ値が０、レコード番号１のデータ値が５、レコード番号２のデータ値が１０、レコード番号３のデータ値が３である。各データはビット列［０］〜［３］の４ビットデータであり、スキャンデータ及びマスクデータも４ビットである。
【００７１】
図９Ａに示すように、実施の形態１と同様、マスタマスク“１１１１”により、１回目のスキャンダウンを行う（Ｓ４０１）。ビット列［３］のスキャンデータのマスク結果は“１１０１”となり（Ｓ４０２）、ビット列［２］のスキャンデータのマスク結果は“１００１”となり（Ｓ４０３）、ビット列［１］のスキャンデータのマスク結果は“１０００”となり（Ｓ４０４）、ビット列［０］のスキャンデータのマスク結果は“１０００”となる（Ｓ４０５）。
【００７２】
１回目のスキャンダウン処理の結果は、ビット列［０］のマスク結果“１０００”となる（Ｓ４０６）。すなわち、“１０００”のＯＮビットのレコード番号０が最小値のデータとして出力される。また、現在のマスタマスク“１１１１”と１回目のスキャンダウン処理結果をＮＯＴ演算した結果“０１１１”を使いマスクすることにより、次の２回目のスキャンダウン用の新しいマスタマスクを“０１１１”とする（Ｓ４０７）。
【００７３】
次に、２回目のスキャンダウン処理では、新しいマスタマスク“０１１１”を用いて（Ｓ４１１）、レコード番号１、２、３のデータをソート対象として、１回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列［３］のスキャンデータのマスク結果は“０１０１”となり（Ｓ４１２）、ビット列［２］のスキャンデータのマスク結果は“０００１”となり（Ｓ４１３）、ビット列［１］のスキャンデータのマスク結果はオール０（“００００”）となり（Ｓ４１４）、ビット列［０］のスキャンデータのマスク結果はオール０となる（Ｓ４１５）。
【００７４】
２回目のスキャンダウン処理の結果は、ビット列［０］及び［１］のマスク結果が０であるため、ビット列［２］のマスク結果“０００１”となる（Ｓ４１６）。すなわち、“０００１”のオンビットのレコード番号３が２番目に小さいデータとして出力される。また、現在のマスタマスク“０１１１”と２回目のスキャンダウン処理結果をＮＯＴ演算した結果“１１１０”とのマスクにより、次の３回目のスキャンダウン用の新しいマスタマスクを“０１１０”とする（Ｓ４１７）。スキャンダウン処理を中断する場合、この時点のマスタマスク“０１１０”をマスク退避部１３１に退避する（Ｓ４１８）。この例は、２個のデータが得られた場合に処理を中断する例であり、中断時のソート処理の結果は、個数＝２、レコード番号＝（０），（３）となる。
【００７５】
その後、スキャンダウン処理を再開する場合、マスク退避部１３１からマスタマスク“０１１０”を回復する（Ｓ４２０）。次に、３回目のスキャンダウン処理では、回復したマスタマスク“０１１０”を用いて（Ｓ４２１）、レコード番号１、２のデータをソート対象として、１回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列［３］のスキャンデータのマスク結果は“０１００”となり（Ｓ４２２）、ビット列［２］のスキャンデータのマスク結果はオール０となり（Ｓ４２３）、ビット列［１］のスキャンデータのマスク結果は“０１００”となり（Ｓ４２４）、ビット列［０］のスキャンデータのマスク結果はオール０となる（Ｓ４２５）。
【００７６】
３回目のスキャンダウン処理の結果は、ビット列［０］のマスク結果が０であるため、ビット位置［１］のマスク結果“０１００”となる（Ｓ４２６）。すなわち、“０１００”のＯＮビットのレコード番号１が３番目に小さいデータとして出力される。また、現在のマスタマスク“０１１０”と３回目のスキャンダウン処理結果をＮＯＴ演算した結果“１０１１”とのマスクにより、次の４回目のスキャンダウン用の新しいマスタマスクを“００１０”とする（Ｓ４２７）。
【００７７】
次に、４回目のスキャンダウン処理を行う。４回目のスキャンダウン処理では、新しいマスタマスク“００１０”を用いて（Ｓ４３１）、レコード番号２のデータをソート対象として、１回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列［３］のスキャンデータのマスク結果はオール０となり（Ｓ４３２）、ビット列［２］のスキャンデータのマスク結果は“００１０”となり（Ｓ４３３）、ビット列［１］のスキャンデータのマスク結果はオール０となり（Ｓ４３４）、ビット列［０］のスキャンデータのマスク結果は“００１０”となる（Ｓ４３５）。
【００７８】
４回目のスキャンダウン処理の結果は、ビット列［０］のマスク結果“００１０”となる（Ｓ４３６）。すなわち、“００１０”のＯＮビットのレコード番号２が４番目に小さいデータとして出力される。また、現在のマスタマスク“００１０”と４回目のスキャンダウン処理結果をＮＯＴ演算した結果“１１０１”とのマスク結果が“００００”となり、全ビットがＯＦＦのため、処理を終了する（Ｓ４３７）。再開後のソート処理の結果は、個数＝２、レコード番号＝（１），（２）となる。
【００７９】
＜本実施の形態の効果＞
以上のように、本実施の形態では、スキャンダウンによるグルーピングソート処理において、グルーピングにより任意の数のデータを取得した時点で、一旦マスタマスクを退避しておくことで、グルーピングソート処理を中断し、それまでのグルーピングソート結果を出力することができる。これにより、特定のグルーピングキーにランキング評価値が格納されているような場合、この値の上位、もしくは下位から指定件数だけを、効率よく取得することが可能になる。
【００８０】
さらに、退避しておいたマスタマスクを回復し、スキャンダウン処理を再開することで、中断前の状態からの継続（インクリメンタル）としてのグルーピングソート結果を取得し、中断位置から処理を再開することができる。グルーピングソート結果は必ず昇順または降順で先頭から順番に出力されるため、先頭から１０件や１００件などの件数のデータのみを取得することも可能で、その場合の処理コストは取得する件数に比例する。なお、マスタマスクは処理対象を絞り込む機能を持つため、何らかの事前絞り込み処理の結果によりマスタマスクを設定（対象レコードのビットのみＯＮ）してもよい。
【００８１】
（実施の形態３）
次に、実施の形態３について説明する。本実施の形態では、実施の形態１、２のデータ処理装置において、ビットスキャン処理の開始前に処理対象のデータを絞り込むことでポジショナルグルーピング処理を行う例について説明する。
【００８２】
＜データ処理装置の構成＞
図１０は、本実施の形態に係るデータ処理装置の構成例を示している。図１０に示すように、本実施の形態に係るデータ処理装置１００は、実施の形態１の構成に加えて、絞り込み部１３２を備えている。
【００８３】
絞り込み部１３２は、グルーピングソート処理を行う前に、グルーピングソート処理の対象となるデータを所定の範囲に絞り込む。絞り込み部１３２は、入力データからソート対象のデータを絞り込み、絞り込み結果に応じてマスク保持部１３０のマスタマスクを更新する。絞り込み部１３２は、Ｎ個のスキャンデータに対しビット列順にビットスキャン処理（すなわち、スキャンダウン処理）を行うことで、入力データから所定の範囲のデータを抽出する。例えば、昇順にソートする場合、絞り込みの基準値を示す絞り込み開始データよりも大きい（または基準値以上の）データを抽出し、降順にソートする場合、絞り込み開始データよりも小さい（または基準値以下の）データを抽出する。これにより、絞り込み開始データの位置からグルーピングソートを開始するポジショナルグルーピング処理を行うことができる。
【００８４】
＜昇順のポジショナルグルーピングソート処理の処理フロー＞
図１１は、本実施の形態に係るデータ処理方法のフローチャートを示している。図１１は、昇順のポジショナルグルーピング処理の例であり、絞り込み開始データよりも大きいデータに絞り込み（大なり検索し）、絞り込んだデータをグルーピングソートする例である。例えば、以下の処理は主に絞り込み部１３２により実行されるが、これに限られない。
【００８５】
図１１に示すように、まず、データ処理装置１００は、絞り込み処理の初期設定として、スタートマスク（Ｓｔａｒｔ＿ｍａｓｋ）を０に初期化し、変数ＰにＭＳＢ位置を設定する（Ｓ５０１）。スタートマスクは、絞り込み結果により、グルーピングソート処理の開始位置を設定するためのマスクデータである。変数Ｐは、実施の形態１と同様に、取得するスキャンデータのビット列を示す。
【００８６】
次に、データ処理装置１００は、絞り込み開始データのＰビット列のビットが０（ＯＦＦ）か否か判定する（Ｓ５０２）。絞り込み開始データは、データを所定範囲に絞り込む基準値であり、昇順ソートの場合、抽出（検索）するデータの最小値を示し、降順ソートの場合、抽出するデータの最大値を示す。
【００８７】
Ｓ５０２で絞り込み開始データのＰビット列のビットが０の場合、データ処理装置１００は、テンポラリ変数（Ｔｍｐ）にマスタマスク（Ｍａｓｋ）を設定し、Ｐビット列のスキャンデータのＮＯＴ演算結果とマスタマスクとをＡＮＤ演算した結果によりマスタマスクを更新し、続けてテンポラリ変数とマスタマスクとをＸＯＲ演算し、さらにそのＸＯＲ演算結果とスタートマスクとをＯＲ（論理和）演算した結果によりスタートマスクを更新する（Ｓ５０３）。また、Ｓ５０２で絞り込み開始データのＰビット列のビットが０以外の場合、データ処理装置１００は、Ｐビット列のスキャンデータとマスタマスクとをＡＮＤ演算した結果によりマスタマスクを更新する（Ｓ５０４）。
【００８８】
Ｓ５０３またはＳ５０４の後、データ処理装置１００は、処理中のビット列である変数ＰがＬＳＢか否か、すなわち、全ビットのスキャンが終了したか否か判定する（Ｓ５０５）。Ｓ５０５で変数ＰがＬＳＢ以外の場合、すなわち、全ビットのスキャンが終了していない場合、データ処理装置１００は、次のスキャンのために、変数ＰをＬＳＢ側に一つ移動し（Ｓ５０６）、Ｓ５０２以降で次のビット列に対するビットスキャン処理（絞り込み処理）を繰り返す。また、Ｓ５０５で変数ＰがＬＳＢである場合、すなわち、全ビットのスキャンが終了した場合、データ処理装置１００は、絞り込み開始データよりも大きいデータの検索結果（大なり検索結果）としてスタートマスクをマスタマスクに設定する（Ｓ５０７）。なお、絞り込み開始データ以上の検索結果（大なりイコール検索結果）とする場合、求めたスタートマスクと現在のマスタマスクをＯＲ演算した結果をマスタマスクに設定する。その後、実施の形態１で示した昇順のグルーピングソート処理を行う（Ｓ５０８）。
【００８９】
＜大なり検索処理の動作例＞
図１２は、本実施の形態に係るデータ処理の動作例を示している。図１２は、昇順のポジショナルグルーピングソート処理のための絞り込み処理の例であり、比較値よりも大きいデータを検索する大なり検索の例である。
【００９０】
図１２の例では、大なり検索のための比較値（絞り込み開始データ）は５であり、レコード番号０〜３の４レコードのデータが入力される。レコード番号０のデータ値が３、レコード番号１のデータ値が７、レコード番号２のデータ値が５、レコード番号３のデータ値が１５である。各データはビット列［０］〜［３］の４ビットのデータあり、スキャンデータ及びマスクデータは４ビットである。
【００９１】
図１２に示すように、マスタマスク（ＥｘｉｓｔＭａｓｋ）の初期値は“１１１１”であり（Ｓ６０１）、スタートマスク（ＧｒｅａｔｅｒＭａｓｋ）の初期値は“００００”である（Ｓ６０２）。
【００９２】
まず、比較値のビット列［３］が０であるため、ビット列［３］のスキャンデータに対しビットスキャン処理及びスタートマスク更新処理を行う。具体的には、マスタマスク“１１１１”をマスクデータとして、ビット列［３］のスキャンデータ“０００１”をＮＯＴ演算した結果“１１１０”をマスクにかけ、マスク結果が“１１１０”となる（Ｓ６０３）。さらに、マスクデータ“１１１１”とマスク結果“１１１０”をＸＯＲ演算し、ＸＯＲ結果“０００１”とスタートマスク“００００”をＯＲ演算し、その結果によりスタートマスクを“０００１”とする（Ｓ６０４）。
【００９３】
次に、比較値のビット列［２］が１であるため、ビット列［２］のスキャンデータに対しビットスキャン処理を行う。具体的には、ビット列［３］のマスク結果“１１１０”をマスクデータとして、ビット列［２］のスキャンデータ“０１１１”をマスクにかけ、マスク結果が“０１１０”となる（Ｓ６０５）。
【００９４】
次に、比較値のビット列［１］が０であるため、ビット列［１］のスキャンデータに対しビットスキャン処理及びスタートマスク更新処理を行う。具体的には、ビット列［２］のマスク結果“０１１０”をマスクデータとして、ビット列［１］のスキャンデータ“１１０１”をＮＯＴ演算した結果“００１０”をマスクにかけ、マスク結果が“００１０”となる（Ｓ６０６）。さらに、マスクデータ“０１１０”とマスク結果“００１０”をＸＯＲ演算し、ＸＯＲ結果“０１００”とスタートマスク“０００１”をＯＲ演算し、その結果によりスタートマスクを“０１０１”とする（Ｓ６０７）。
【００９５】
次に、比較値のビット列［０］が１であるため、ビット列［０］のスキャンデータに対しビットスキャン処理を行う。具体的には、ビット列［１］のマスク結果“００１０”をマスクデータとして、ビット列［０］のスキャンデータ“１１１１”にマスクをかけ、マスク結果が“００１０”となる（Ｓ６０８）。
【００９６】
これにより、ビット列［０］のマスク結果“００１０”が同値検索の結果となる（Ｓ６０９）。すなわち、“００１０”のＯＮビットのレコード番号２が比較値５と同値のデータとなる。また、ビット列［１］で更新されたスタートマスク“０１０１”が大なり検索の結果となる（Ｓ６１０）。すなわち、“０１０１”のＯＮビットのレコード番号１、３が比較値５よりも大きいデータとなる。さらに、大なりイコールの検索結果とする場合は、同値の結果“００１０”とスタートマスク“０１０１”をＯＲ演算することにより、“０１１１”が得られ、これが大なりイコールの検索結果となる。
【００９７】
このように、スタートマスク（ＧｒｅａｔｅｒＭａｓｋ）を用意し、このスタートマスクに、比較値のビットがＯＦＦのビット列について、検索先のデータビットがＯＮの箇所を論理和（ＯＲ）していくことにより、比較値よりも大きいデータを検索する大なり検索の結果が得られる。本実施の形態では、この検索処理により得られるスタートマスクをグルーピングソート（昇順）開始時のマスクデータとする。また、大なりイコール（比較値以上）のデータを検索する場合は、大なり検索結果と同値結果を論理和演算した結果をマスクデータとする。なお、図１２において、ビットスキャン処理でマスク結果が０となった場合、未処理データが無いと判断して、検索処理を早期終了してもよい。
【００９８】
＜降順のポジショナルグルーピングソート処理の処理フロー＞
図１３は、本実施の形態に係るデータ処理方法のフローチャートの他の例を示している。図１３は、降順のポジショナルグルーピング処理の例であり、絞り込み開始データよりも小さいデータに絞り込み（小なり検索）し、絞り込んだデータをグルーピングソートする例である。図１３では、図１１の昇順のフローチャートに対し、Ｓ５０２ａ、Ｓ５０３ａ、Ｓ５０４ａ、Ｓ５０８ａが異なる。
【００９９】
すなわち、降順の場合、Ｓ５０１の後、データ処理装置１００は、絞り込み開始データのＰビット列のビットが１（ＯＮ）か否か判定する（Ｓ５０２ａ）。Ｓ５０２ａで絞り込み開始データのＰビット列のビットが１の場合、データ処理装置１００は、テンポラリ変数（Ｔｍｐ）にマスタマスク（Ｍａｓｋ）を設定し、続けてＰビット列のスキャンデータとマスタマスクとをＡＮＤ演算した結果によりマスタマスクを更新し、さらにテンポラリ変数とマスタマスクとをＸＯＲ演算し、そのＸＯＲ演算結果とスタートマスクとをＯＲ演算した結果によりスタートマスクを更新する（Ｓ５０３ａ）。また、絞り込み開始データのＰビット列のビットが１以外の場合、データ処理装置１００は、Ｐビット列のスキャンデータのＮＯＴ演算結果とマスタマスクとをＡＮＤ演算した結果によりマスタマスクを更新する（Ｓ５０４ａ）。さらに、Ｓ５０７のマスタマスクの更新後、実施の形態１で示した降順のグルーピングソート処理を行う（Ｓ５０８ａ）。
【０１００】
＜小なり検索処理の動作例＞
図１４は、本実施の形態に係るデータ処理の他の動作例を示している。図１４は、降順のポジショナルグルーピングソート処理のための絞り込み処理の例であり、比較値よりも小さいデータを検索する小なり検索の例である。図１４の例では、小なり検索のための比較値（絞り込み開始データ）及び入力されるデータは図１２と同じである。
【０１０１】
図１４に示すように、マスタマスク（ＥｘｉｓｔＭａｓｋ）の初期値は“１１１１”であり（Ｓ７０１）、スタートマスク（ＬｅｓｓＭａｓｋ）の初期値は“００００”である（Ｓ７０２）。
【０１０２】
まず、比較値のビット列［０］が０であるため、ビット列［３］のスキャンデータに対しビットスキャン処理を行う。具体的には、マスタマスク“１１１１”をマスクデータとして、ビット列［３］のスキャンデータ“０００１”をＮＯＴ演算した結果“１１１０”をマスクにかけ、マスク結果が“１１１０”となる（Ｓ７０３）。
【０１０３】
次に、比較値のビット列［２］が１であるため、ビット列［２］のスキャンデータに対しビットスキャン処理及びスタートマスク更新処理を行う。具体的には、ビット列［３］のマスク結果“１１１０”をマスクデータとして、ビット列［２］のスキャンデータ“０１１１”をマスクにかけ、マスク結果が“０１１０”となる（Ｓ７０４）。さらに、マスクデータ“１１１０”とマスク結果“０１１０”をＸＯＲ演算し、ＸＯＲ結果“１０００”とスタートマスク“００００”をＯＲ演算し、その結果によりスタートマスクを“１０００”とする（Ｓ７０５）。
【０１０４】
次に、比較値のビット列［１］が０であるため、ビット列［１］のスキャンデータに対しビットスキャン処理を行う。具体的には、ビット列［２］のマスク結果“０１１０”をマスクデータとして、ビット列［１］のスキャンデータ“１１０１”をＮＯＴ演算した結果“００１０”をマスクにかけ、マスク結果が“００１０”となる（Ｓ７０６）。
【０１０５】
次に、比較値のビット列［０］が１であるため、ビット列［０］のスキャンデータに対しビットスキャン処理及びスタートマスク更新処理を行う。具体的には、ビット列［１］のマスク結果“００１０”をマスクデータとして、ビット列［０］のスキャンデータ“１１１１”をマスクにかけ、マスク結果が“００１０”となる（Ｓ７０７）。さらに、マスクデータ“００１０”とマスク結果“００１０”をＸＯＲ演算し、ＸＯＲ結果“００００”とスタートマスク“１０００”をＯＲ演算し、その結果によりスタートマスクを“１０００”とする（Ｓ７０８）。
【０１０６】
これにより、ビット列［０］のマスク結果“００１０”が同値検索の結果となる（Ｓ７０９）。すなわち、“００１０”のＯＮビットのレコード番号２が比較値５と同値のデータとなる。また、ビット列［０］で更新されたスタートマスク“１０００”が小なり検索の結果となる（Ｓ７１０）。すなわち、“１０００”のＯＮビットのレコード番号０が比較値５よりも小さいデータとなる。小なりイコール検索の場合は、同値の結果“００１０”とスタートマスク“１０００”をＯＲすることにより、“１０１０”が得られ、これが小なりイコールの検索結果となる。
【０１０７】
このように、スタートマスク（ＬｅｓｓＭａｓｋ）を用意し、このスタートマスクに、比較値のビットがＯＮのビット列について、検索先のデータビットがＯＦＦの箇所を論理和（ＯＲ）していくことにより、比較値よりも小さいデータを検索する小なり検索の結果が得られる。本実施の形態では、この検索処理により得られるスタートマスクをグルーピングソート（降順）開始時のマスクデータとする。また、小なりイコール（比較値以下）データを検索する場合は、小なり検索結果と同値結果を論理和演算した結果をマスクデータとする。なお、図１４において、ビットスキャン処理でマスク結果が０となった場合、未処理データが無いと判断して、検索処理を早期終了してもよい。
【０１０８】
＜本実施の形態の効果＞
以上のように、本実施の形態では、スキャンダウン処理によるグルーピングソート処理において、処理の開始時に、絞り込み開始データを使用して絞り込み処理を行い、その処理結果と連動してグルーピングソート処理を行うことで、絞り込み開始データで指定した任意の位置からグルーピングした結果を得ることができる。例えば、実施の形態２のような取得件数指定と本実施の形態を組み合わせることで、任意の値を開始値とした、任意の件数のグルーピングソートの結果を、取得することが出来る。また、これを応用し、直前のグルーピング結果の最終値を、次のポジショナルグルーピングの開始位置に指定することで、関連する技術を使ったグルーピング処理方式では難しかった、グルーピング結果の部分取得とスクロール動作が可能になる。さらに、ポジショナルグルーピングの開始位置を任意の値に設定することで、ジャンプスクロールの動作にも応用できる。加えて、絞り込み処理をする前のマスタマスクと、絞り込み結果のスタートマスクをＸＯＲすることで、絞り込みによって外れるデータのマスクを得ることも出来るため、この部分の件数の取得や、該当するレコードの特定の要素（データ値）を加算して合計を求めることも出来る。
【０１０９】
なお、昇順、降順いずれのポジショナルグルーピング処理においても、後続のグルーピングソート処理を省略することで、大なり、もしくは小なりのデータ検索処理とすることが出来る。同様に、大なりイコール、小なりイコールの検索結果とする場合は、これに加えて、同値のマスクを単純にＯＲすれば良い。
【０１１０】
（実施の形態３の変形例）
実施の形態３の変形例として、絞り込み部１３２において、絞り込みと同時に、最初のグルーピングソート結果を出力してもよい。
【０１１１】
＜昇順のポジショナルグルーピングソート処理の処理フロー＞
図１５は、本変形例のフローチャートであり、図１１に示した、昇順のポジショナルグルーピング処理の変形例を示している。
【０１１２】
図１５に示すように、まず、データ処理装置１００は、スタートマスク（Ｓｔａｒｔ＿ｍａｓｋ）と変数Ｐの初期設定に加えて、ファーストマスク（Ｆｉｒｓｔ＿ｍａｓｋ）を０に初期化するする（Ｓ５１１）。ファーストマスクは、最も絞り込み開始データに近い最初の抽出データ（グルーピング結果）を示す。
【０１１３】
次に、データ処理装置１００は、絞り込み開始データのＰビット列のビットが０か否か判定し（Ｓ５１２）、絞り込み開始データのＰビット列のビットが０の場合、テンポラリ変数（Ｔｍｐ）にマスタマスク（Ｍａｓｋ）を設定し、Ｐビット列のスキャンデータのＮＯＴ演算結果とマスタマスクとをＡＮＤ演算した結果によりマスタマスクを更新し、続けて、テンポラリ変数とマスタマスクとをＸＯＲ演算した結果で、テンポラリ変数を更新する（Ｓ５１３）。
【０１１４】
次に、データ処理装置１００は、テンポラリ変数が０か否かを判定する（Ｓ５１４）。Ｓ５１４でテンポラリ変数が０以外の場合、すなわち、ビットスキャンにより新たに絞り込み開始データより大きく、より絞り込み開始データに近いデータが抽出された場合、データ処理装置１００は、テンポラリ変数の内容をファーストマスク(最初のグルーピング結果)に設定し、さらにテンポラリ変数とスタートマスクをＯＲ（論理和）演算した結果によりスタートマスクを更新する（Ｓ５１５）。
【０１１５】
また、Ｓ５１２で絞り込み開始データのＰビット列のビットが０以外の場合、データ処理装置１００は、Ｐビット列のスキャンデータとマスタマスクとをＡＮＤ演算した結果によりマスタマスクを更新する（Ｓ５１６）。その後、データ処理装置１００は、Ｓ５１４でテンポラリ変数が０だった場合も含め、Ｐビット列のスキャンデータのＮＯＴ演算結果とファーストマスクをＡＮＤ演算した結果をテンポラリ変数に設定する（Ｓ５１７）。その後、データ処理装置１００は、テンポラリ変数が０か否かを判定する（Ｓ５１８）。Ｓ５１８でテンポラリ変数が０以外の場合、すなわち、Ｓ５１７のビットスキャンにより行われた、小さな値への絞り込みが有効だった場合、データ処理装置１００は、テンポラリ変数の内容をファーストマスクに設定し、最初のグルーピング結果を更新する（Ｓ５１９）。
【０１１６】
Ｓ５１５、またはＳ５１９の後、あるいはＳ５１８でテンポラリ変数が０の場合、データ処理装置１００は、処理中のビット列である変数ＰがＬＳＢか否か、すなわち、全ビットのスキャンが終了したか否か判定する（Ｓ５２０）。Ｓ５２０で変数ＰがＬＳＢ以外の場合、すなわち、全ビットのスキャンが終了していない場合、データ処理装置１００は、次のスキャンのために、変数ＰをＬＳＢ側に一つ移動し（Ｓ５２１）、Ｓ５１２以降で次のビット列に対するビットスキャン処理（絞り込み処理）を繰り返す。
【０１１７】
また、Ｓ５２０で変数ＰがＬＳＢである場合、すなわち、全ビットのスキャンが終了した場合、データ処理装置１００は、最初のグルーピング結果として、ファーストマスクの内容を出力する（Ｓ５２２）。続いて、データ処理装置１００は、ファーストマスクのＮＯＴ演算結果と絞り込み開始データよりも大きいデータの検索結果（大なり検索結果）であるスタートマスクをＡＮＤ演算した結果をマスタマスクに設定する（Ｓ５２３）。その後、このマスタマスクを使い、実施の形態１で示した昇順のグルーピングソートを使って後続のグルーピングソート処理を行う（Ｓ５２４）。なお、絞り込み開始データ以上の検索結果（大なりイコール検索結果）とする場合は、Ｓ５２２の前に、その時点のマスタマスク(同値結果)が０か否かを判定し、０以外なら(同値があれば)、マスタマスクをファーストマスクに設定する。
【０１１８】
なお、図１３と同様、昇順の処理の一部を変更することで、降順のポジショナルグルーピングソート処理を行うことができる。具体的には、降順の場合、図１５の昇順のフローチャートに対し、Ｓ５１２、Ｓ５１３、Ｓ５１６、Ｓ５１７、Ｓ５２４の処理を変更する。すなわち、Ｓ５１２では、絞り込み開始データのＰビット列のビットが１（ＯＮ）か否か判定する。Ｓ５１３では、絞り込み開始データのＰビット列のビットが１の場合に、テンポラリ変数（Ｔｍｐ）にマスタマスク（Ｍａｓｋ）を設定し、Ｐビット列のスキャンデータとマスタマスクとをＡＮＤ演算した結果によりマスタマスクを更新し、続けて、テンポラリ変数とマスタマスクとをＸＯＲ演算した結果で、テンポラリ変数を更新する。Ｓ５１６では、絞り込み開始データのＰビット列のビットが１以外の場合に、Ｐビット列のスキャンデータのＮＯＴ演算結果とマスタマスクとをＡＮＤ演算した結果によりマスタマスクを更新する。Ｓ５１７では、Ｓ５１４でテンポラリ変数が０だった場合も含め、Ｐビット列のスキャンデータとファーストマスクをＡＮＤ演算することで、大きな値への絞り込みを行った結果をテンポラリ変数に設定する。Ｓ５２４では、Ｓ５２３のマスタマスクの更新後に、実施の形態１で示した降順のグルーピングソート処理を行う。
【０１１９】
＜大なり検索処理の動作例＞
図１６Ａ及び図１６Ｂは、本変形例の動作例であり、図１２に示した、昇順のポジショナルグルーピングソートにおける大なり検索処理の動作例の変形例である。
【０１２０】
図１６Ａ及び図１６Ｂの例では、大なり検索のための比較値（絞り込み開始データ）は５であり、レコード番号０〜５の６レコードのデータが入力される。レコード番号０のデータ値が３、レコード番号１のデータ値が７、レコード番号２のデータ値が５、レコード番号３のデータ値が１５、レコード番号４のデータ値が６、レコード番号５のデータ値が１０である。各データはビット列［０］〜［３］の４ビットのデータあり、スキャンデータ及びマスクデータは６ビットである。
【０１２１】
図１６Ａ及び図１６Ｂに示すように、マスタマスク（ＥｘｉｓｔＭａｓｋ）の初期値は“１１１１１１”であり（Ｓ６１１）、ファーストマスク（ＦｉｒｓｔＭａｓｋ）の初期値は“００００００”であり（Ｓ６１２）、スタートマスク（ＧｒｅａｔｅｒＭａｓｋ）の初期値は“００００００”である（Ｓ６１３）。
【０１２２】
まず、比較値のビット列［３］が０であるため、ビット列［３］のスキャンデータに対しビットスキャン処理及びファーストマスクとスタートマスクの更新処理を行う。具体的には、マスタマスク“１１１１１１”をマスクデータとして、ビット列［３］のスキャンデータ“０００１０１”をＮＯＴ演算した結果“１１１０１０”をマスクにかけ、マスク結果が“１１１０１０”となる（Ｓ６１４）。さらに、マスクデータ“１１１１１１”とマスク結果“１１１０１０”をＸＯＲ演算した結果“０００１０１”でファーストマスクを更新し、続けてファーストマスクとスタートマスク“００００００”をＯＲ演算し、その結果によりスタートマスクを“０００１０１”とする（Ｓ６１５）。
【０１２３】
次に、比較値のビット列［２］が１であるため、ビット列［２］のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、ビット列［３］のマスク結果“１１１０１０”をマスクデータとして、ビット列［２］のスキャンデータ“０１１１１０”をマスクにかけ、マスク結果が“０１１０１０”となる（Ｓ６１６）。さらに、ビット列［３］で更新したファーストマスク“０００１０１”に対し、ビット列［２］のスキャンデータ“０１１１１０”をＮＯＴ演算した結果“１００００１”をＡＮＤ演算し、その結果でファーストマスクを“０００００１”とする（Ｓ６１７）。
【０１２４】
次に、比較値のビット列［１］が０であるため、ビット列［１］のスキャンデータに対しビットスキャン処理及びファーストマスクとスタートマスクの更新処理を行う。具体的には、ビット列［２］のマスク結果“０１１０１０”をマスクデータとして、ビット列［１］のスキャンデータ“１１０１１１”をＮＯＴ演算した結果“００１０００”をマスクにかけ、マスク結果が“００１０００”となる（Ｓ６１８）。さらに、マスクデータ“０１１０１０”とマスク結果“００１０００”をＸＯＲ演算した結果“０１００１０”でファーストマスクを更新し、続けてファーストマスクとスタートマスク“０００１０１”をＯＲ演算し、その結果により、スタートマスクを“０１０１１１”とする（Ｓ６１９）。
【０１２５】
次に、比較値のビット列［０］が１であるため、ビット列［０］のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、ビット列［１］のマスク結果“００１０００”をマスクデータとして、ビット列［０］のスキャンデータ“１１１１００”をマスクにかけ、マスク結果が“００１０００”となる（Ｓ６２０）。さらに、ビット列［１］で更新したファーストマスク“０１００１０”に対し、ビット列［０］のスキャンデータ“１１１１００”をＮＯＴ演算した結果“００００１１”をＡＮＤ演算し、その結果でファーストマスクを“００００１０”とする（Ｓ６２１）。
【０１２６】
これにより、ビット列［０］のマスク結果“００１０００”が同値検索の結果となる（Ｓ６２２）。すなわち、“００１０００”のＯＮビットのレコード番号２が比較値５と同値のデータとなる。また、ビット列［１］で更新されたスタートマスク“０１０１１１”が大なり検索の結果となる（Ｓ６２３）。すなわち、“０１０１１１”のＯＮビットのレコード番号１、３、４，５が比較値５よりも大きいデータとなる。さらに、ビット列［０］で設定したファーストマスク“００００１０”が、最初のポジショナルグルーピング結果となる（Ｓ６２４）。すなわち、“００００１０”のＯＮビットのレコード番号４が、大なり検索で比較値５に最も近いポジショナルグルーピングデータとなる。
【０１２７】
なお、後続のグルーピング処理は、ファーストマスク“ ００００１０”をＮＯＴ演算した結果“１１１１０１”と、Ｓ６２３で得た大なり検索のマスク“０１０１１１”をＡＮＤ演算した結果である“０１０１０１”をマスタマスクとして、基本グルーピングソート(昇順)を行うことで実施する（Ｓ６２５）。また、大なりイコールに対応する場合は、同値の結果“００１０００”を最初のポジショナルグルーピング結果とし、Ｓ６２３で得た大なり検索のマスク“０１０１１１”を基本グルーピングソート(昇順)のマスタマスクに引き継ぐことで処理を行う。
【０１２８】
このように、本変形例では、スタートマスク（ＧｒｅａｔｅｒＭａｓｋ）に加えてファーストマスク（ＦｉｒｓｔＭａｓｋ）を用意し、このファーストマスクに、比較値のビットがＯＦＦのビット列について、検索先のデータビットがＯＮの箇所を設定し、同時に、ファーストマスクをスタートマスクに論理和（ＯＲ）していくことにより、比較値よりも大きく、比較値により近いデータと、大なり検索の結果が得られる。その後は、ファーストマスクを昇順のグルーピング処理と同じく、最小値に向かってスキャンダウンしていくことで、一回のスキャンダウン処理で最初のグルーピング結果と、大なり検索の結果を同時に得られる。本変形例では、この処理により得られるファーストマスクを最初のポジショナルグルーピングの結果とし、以降のグルーピングはスタートマスクからファーストマスクを外したマスク結果を基本グルーピングソート(昇順)開始時のマスクデータとして実施する。また、大なりイコール（比較値以上）のデータを検索する場合は、同値結果を最初のグルーピング結果とし、スタートマスクを基本グルーピングソート(昇順)開始時のマスクデータとする。
【０１２９】
＜小なり検索処理の動作例＞
図１７Ａ及び図１７Ｂは、本変形例の他の動作例であり、図１４に示した、降順のポジショナルグルーピングソートにおける小なり検索処理の動作例の変形例である。図１７Ａ及び図１７Ｂの例では、小なり検索のための比較値（絞り込み開始データ）及び入力されるデータは図１６Ａ及び図１６Ｂと同じである。
【０１３０】
図１７Ａ及び図１７Ｂに示すように、マスタマスク（ＥｘｉｓｔＭａｓｋ）の初期値は“１１１１１１”であり（Ｓ７１１）、ファーストマスク（ＦｉｒｓｔＭａｓｋ）の初期値は”００００００”であり（Ｓ７１２）、スタートマスク（ＬｅｓｓＭａｓｋ）の初期値は“００００００”である（Ｓ７１３）。
【０１３１】
まず、比較値のビット列［３］が０であるため、ビット列［３］のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、マスタマスク“１１１１１１”をマスクデータとして、ビット列［３］のスキャンデータ“０００１０１”をＮＯＴ演算した結果“１１１０１０”をマスクにかけ、マスク結果が“１１１０１０”となる（Ｓ７１４）。さらに、初期値であるファーストマスク“００００００”に対し、ビット列［３］のスキャンデータ“０００１０１”をＡＮＤ演算し、その結果がオール０（“００００００”）となるため、ファーストマスクの更新は行わない（Ｓ７１５）。
【０１３２】
次に、比較値のビット列［２］が１であるため、ビット列［２］のスキャンデータに対しビットスキャン処理及びファーストマスクとスタートマスクの更新処理を行う。具体的には、ビット列［３］のマスク結果“１１１０１０”をマスクデータとして、ビット列［２］のスキャンデータ“０１１１１０”をマスクにかけ、マスク結果が“０１１０１０”となる（Ｓ７１６）。さらに、マスクデータ“１１１０１０”とマスク結果“０１１０１０”をＸＯＲ演算した結果“１０００００”でファーストマスクを更新し、続けてファーストマスクとスタートマスク“００００００”をＯＲ演算し、その結果によりスタートマスクを“１０００００”とする（Ｓ７１７）。
【０１３３】
次に、比較値のビット列［１］が０であるため、ビット列［１］のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、ビット列［２］のマスク結果“０１１０１０”をマスクデータとして、ビット列［１］のスキャンデータ“１１０１１１”をＮＯＴ演算した結果“００１０００”をマスクにかけ、マスク結果が“００１０００”となる（Ｓ７１８）。さらに、ビット列［２］で更新したファーストマスク“１０００００”に対し、ビット列［１］のスキャンデータ“１１０１１１”をＡＮＤ演算し、その結果でファーストマスクを“１０００００”とする（Ｓ７１９）。
【０１３４】
次に、比較値のビット列［０］が１であるため、ビット列［０］のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、ビット列［１］のマスク結果“００１０００”をマスクデータとして、ビット列［０］のスキャンデータ“１１１１００”をマスクにかけ、マスク結果が“００１０００”となる（Ｓ７２０）。さらに、マスクデータ“００１０００”とマスク結果“００１０００”をＸＯＲ演算するが、この結果はオール０（“００００００”）のため、ビット列［１］で更新したファーストマスク“１０００００”に対し、ビット列［０］のスキャンデータ“１１１１００”をＡＮＤ演算し、その結果でファーストマスクを“１０００００”とする（Ｓ７２１）。
【０１３５】
これにより、ビット列［０］のマスク結果“００１０００”が同値検索の結果となる（Ｓ７２２）。すなわち、“００１０００”のＯＮビットのレコード番号２が比較値５と同値のデータとなる。また、ビット列［２］で更新されたスタートマスク“１０００００”が小なり検索の結果となる（Ｓ７２３）。すなわち、“１０００００”のＯＮビットのレコード番号０が比較値５よりも小さいデータとなる。さらに、ビット列［０］で設定したファーストマスク“１０００００”が、最初のポジショナルグルーピング結果となる（Ｓ７２４）。すなわち、“１０００００”のＯＮビットのレコード番号０が、小なり検索で比較値５に最も近い、ポジショナルグルーピングデータとなる。
【０１３６】
なお、この例では、ファーストマスク“１０００００”をＮＯＴ演算した結果“０１１１１１”と、Ｓ７２３で得た小なり検索のマスク“１０００００”をＡＮＤ演算すると結果がオール０（“００００００”）となるため、後続の基本グルーピングソート(降順)で処理するデータは無いことを示す（Ｓ７２５）。また、小なりイコールに対応する場合は、同値の結果“００１０００” を最初のポジショナルグルーピング結果とし、Ｓ７２３で得た小なり検索のマスク“１０００００”を基本グルーピングソート(降順)のマスタマスクに引き継ぐことで処理を行う。
【０１３７】
このように、本変形例では、スタートマスク（ＬｅｓｓＭａｓｋ）に加えてファーストマスク（ＦｉｒｓｔＭａｓｋ）を用意し、このファーストマスクに、比較値のビットがＯＮのビット列について、検索先のデータビットがＯＦＦの箇所を設定し、同時に、ファーストマスクをスタートマスクに論理和（ＯＲ）していくことにより、比較値よりも小さく、比較値により近いデータと、小なり検索の結果が得られる。その後は、ファーストマスクを降順のグルーピング処理と同じく、最大値に向かってスキャンダウンしていくことで、一回のスキャンダウン処理で最初のグルーピング結果と、小なり検索の結果を同時に得られる。本変形例では、この処理により得られるファーストマスクを最初のポジショナルグルーピングの結果とし、以降のグルーピングはスタートマスクからファーストマスクを外したマスク結果を基本グルーピングソート(降順)開始時のマスクデータとして実施する。また、小なりイコール（比較値以下）データを検索する場合は、同値結果を最初のグルーピング結果とし、スタートマスクを基本グルーピングソート(降順)開始時のマスクデータとする。
【０１３８】
（実施の形態４）
次に、実施の形態４について説明する。本実施の形態では、実施の形態１〜３のデータ処理装置において、スキャンデータを分割し、分割したスキャンデータを並列に処理する例について説明する。
【０１３９】
＜データ処理装置の構成＞
図１８は、本実施の形態に係るデータ処理装置の構成例を示している。図１８に示すように、本実施の形態に係るデータ処理装置１００は、実施の形態１の構成に加えて、分割部１２１を備えており、また、２つのスキャンダウン部１４０ａ及び１４０ｂを備えている。
【０１４０】
分割部１２１は、取得部１２０が取得したスキャンデータをスキャンダウン部１４０ａ及び１４０ｂが処理できるように２つの分割スキャンデータに分割する。例えば、システムの処理単位（ワード単位）毎にデータを分割してもよい。スキャンダウン部１４０ａは、分割部１２１が分割した一方の分割スキャンデータに対しスキャンダウン処理を行う。スキャンダウン部１４０ｂは、分割部１２１が分割した他方の分割スキャンデータに対しスキャンダウン処理を行う。例えば、１つのスキャンダウン部において、２つのスキャンダウン処理を並列に実行してもよい。なお、スキャンデータを複数の分割スキャンデータに分割し、分割スキャンデータ毎に複数の処理を並列に実行してもよい。
【０１４１】
＜分割スキャンデータによる昇順の基本グルーピングソート処理の動作例＞
図１９Ａ及び図１９Ｂは、本実施の形態に係るデータ処理方法によるデータ処理の動作例を示している。図１９Ａ及び図１９Ｂは、スキャンデータを分割した分割スキャンデータを用いて、基本グルーピングソート処理を昇順に行う場合の例である。
【０１４２】
なお、分割スキャンデータ毎のスキャンダウン処理は、基本的に実施の形態１と同様であるが、マスク結果の０判定の処理（図３のＳ１０３）のみが異なる。すなわち、分割スキャンデータ毎にビットスキャン処理を行い、全ての分割スキャンデータのマスク結果が０の場合にそのマスク結果を無効とし、以前に有効だったマスク結果を使用して処理を行う（以下のＳ８１４，Ｓ８１５参照）。逆に、複数の分割データのマスク結果が０の場合でも、いずれかの分割データのマスク結果が０でない場合（いずれかのマスク結果にＯＮビットがある場合）は、そのマスク結果は有効として処理する（以下のＳ８０４，Ｓ８０５参照）。
【０１４３】
図１９Ａ及び図１９Ｂの例では、レコード番号０〜６の７レコードのデータが入力される。レコード番号０のデータ値が０、レコード番号１のデータ値が５、レコード番号２のデータ値が１０、レコード番号３のデータ値が３、レコード番号４のデータ値が１０、レコード番号５のデータ値が５、レコード番号６のデータ値が３である。各データはビット列［０］〜［３］の４ビットのデータである。
【０１４４】
スキャンデータは７ビットであり、２つに分割したデータを分割スキャンデータとする。第１分割スキャンデータをレコード０〜３のビットに対応する４ビットとし、第２分割スキャンデータをレコード４〜６のビットに１ビット加えた４ビットとする。マスクデータは、２つの分割スキャンデータに対応して、４ビットの第１マスクデータ及び４ビットの第２マスクデータとする。
【０１４５】
図１９Ａに示すように、１回目のスキャンダウン処理において、第１マスタマスクの初期値は、全ビットをＯＮとした“１１１１”であり、第２マスタマスクの初期値は、最下位ビット（レコード番号7に該当するビット）をＯＦＦ、他のビットをＯＮとした“１１１０”である（Ｓ８０１）。
【０１４６】
ビット列［３］のビットスキャン処理では、第１マスクデータを“１１１１”として、第１分割スキャンデータ“００１０”をＮＯＴ演算した結果“１１０１”を使ってマスクをかけ、第１マスク結果が“１１０１”となり、第２マスクデータを“１１１０”として、第２分割スキャンデータ“１００”に最下位ビット(値は０)を加えてＮＯＴ演算した“０１１１”を使ってマスクをかけ、第２マスク結果が“０１１０”となる（Ｓ８０２）。
【０１４７】
ビット列［２］のビットスキャン処理では、ビット列［３］の第１マスク結果“１１０１”をマスクデータとして、第１分割スキャンデータ“０１００”をＮＯＴ演算した結果“１０１１”を使ってマスクをかけ、第１マスク結果が“１００１”となり、ビット列［３］の第２マスク結果“０１１０”をマスクデータとして、第２分割スキャンデータ“０１０”に最下位ビットを加えてＮＯＴ演算した“１０１１”を使ってマスクをかけ、第２マスク結果が“００１０”となる（Ｓ８０３）。
【０１４８】
ビット列［１］のビットスキャン処理では、ビット列［２］の第１マスク結果“１００１”をマスクデータとして、第１分割スキャンデータ“００１１”をＮＯＴ演算した結果“１１００”を使ってマスクをかけ、第１マスク結果が“１０００”となり、ビット列［２］の第２マスク結果“００１０”をマスクデータとして、第２分割スキャンデータ“１０１”に最下位ビットを加えてＮＯＴ演算した“０１０１”を使ってマスクをかけ、第２マスク結果がオール０（“００００”）となる（Ｓ８０４）。なお、この時点で第２マスク結果が０であるが、第１マスク結果が０以外のため、絞り込みは成功と判断され、ここでのマスク結果をそのまま次のマスクデータとして引き継ぐ。
【０１４９】
ビット列［０］のビットスキャン処理では、ビット列［１］の第１マスク結果“１０００”をマスクデータとして、第１分割スキャンデータ“０１０１”をＮＯＴ演算した結果“１０１０”を使ってマスクをかけ、第１マスク結果が“１０００”となり、ビット列［１］の第２マスク結果“００００”をマスクデータとして、第２分割スキャンデータ“０１１”に最下位ビットを加えてＮＯＴ演算した“１００１”を使ってマスクをかけ、第２マスク結果がオール０となる（Ｓ８０５）。なお、ここでも第２マスク結果が０であるが、第１マスク結果が０以外のため、絞り込みは成功と判断され、ここでのマスク結果をそのまま次のマスクデータとして引き継ぐ。
【０１５０】
１回目のスキャンダウン処理の結果は、ビット列［０］の第１マスク結果“１０００”とビット列［０］の第２マスク結果“００００”とを結合した結果となる（Ｓ８０６）。すなわち、“１０００００００”のＯＮビットのレコード番号０が最小値のデータとして出力される。
【０１５１】
また、現在の第１マスタマスク“１１１１”と第１マスタマスクに対応する１回目のスキャンダウン処理結果をＮＯＴ演算した結果“０１１１”とのマスクにより、２回目のスキャンダウン用の新しい第１マスタマスクを“０１１１”とし、現在の第２マスタマスク“１１１０”と第２マスタマスクに対応する１回目のスキャンダウン処理結果をＮＯＴ演算した結果“１１１１”とのマスクにより、２回目のスキャンダウン用の新しい第２マスタマスクを“１１１０”とする（Ｓ８０７）。
【０１５２】
次に、２回目のスキャンダウン処理では、新しい第１マスタマスク“０１１１”、第２マスタマスク“１１１０”を用いて（Ｓ８１１）、レコード番号１〜６のデータをソート対象として、１回目のスキャンダウン処理と同様にビットスキャン処理を行う。
【０１５３】
ビット列［３］のビットスキャン処理では、第１分割スキャンデータの第１マスク結果は“０１０１”となり、第２分割スキャンデータの第２マスク結果は“０１１０”となる（Ｓ８１２）。ビット列［２］のビットスキャン処理では、第１分割スキャンデータの第１マスク結果は“０００１”となり、第２分割スキャンデータの第２マスク結果は“００１０”となる（Ｓ８１３）。ビット列［１］のビットスキャン処理では、第１分割スキャンデータの第１マスク結果はオール０となり、第２分割スキャンデータの第２マスク結果はオール０となる（Ｓ８１４）。両方のマスク結果がすべて０に成るため、この場合は絞り込みが成立せず、この絞り込み動作は無効と判断される。
【０１５４】
ビット列［０］のビットスキャン処理では、ビット列［１］の第１マスク結果及び第２マスク結果の両方が０であり、無効となるため、ビット列［２］の第１マスク結果及び第２マスク結果を使用する。すなわち、ビット列［２］の第１マスク結果“０００１”をマスクデータとして、第１分割スキャンデータのマスク結果がオール０となり、ビット列［２］の第２マスク結果“００１０”をマスクデータとして、第２分割スキャンデータのマスク結果がオール０となる（Ｓ８１５）。この結果も、両方のマスク結果がすべて０に成るため、Ｓ８１４同様絞り込み動作は無効と判断される。
【０１５５】
２回目のスキャンダウン処理の結果は、ビット列［０］の第１マスク結果及び第２マスク結果が０であり、ビット列［１］の第１マスク結果及び第２マスク結果も０であり、いずれも無効となるため、ビット列［２］の第１マスク結果“０００１”とビット列［２］の第２マスク結果“００１０”とを結合した結果となる（Ｓ８１６）。すなわち、“０００１００１０”のＯＮビットのレコード番号３、６が２番目に小さいデータとして出力される。
【０１５６】
また、現在の第１マスタマスク“０１１１”と第１マスタマスクに対応する２回目のスキャンダウン処理結果をＮＯＴ演算した結果“１１１０”とのマスクにより、３回目のスキャンダウン用の新しい第１マスタマスクを“０１１０”とし、現在の第２マスタマスク“１１１０”と第２マスタマスクに対応する２回目のスキャンダウン処理結果をＮＯＴ演算した結果“１１０１”とのマスクにより、３回目のスキャンダウン用の新しい第２マスタマスクを“１１００”とする（Ｓ８１７）。３回目以降、１回目及び２回目と同様、スキャンダウン処理が繰り返される。
【０１５７】
＜本実施の形態の効果＞
以上のように、本実施の形態では、スキャンダウンによるグルーピングソート処理において、スキャンデータを分割し、分割したデータに対し並列にグルーピングソート処理を行う。入力データのレコードの格納数が多く、一つの操作幅ではビットの横幅が不足するような場合、すなわち、スキャンデータのビット幅が処理単位に収まらない場合、複数のデータに分けて、データ毎にスキャンダウン処理を行うことで、レコード数（横幅）を必要な個数まで拡張することができる。
【０１５８】
（実施の形態５）
次に、実施の形態５について説明する。本実施の形態では、実施の形態１〜４のデータ処理装置において、昇順ソート処理と降順ソート処理を同時に行う例について説明する。
【０１５９】
＜データ処理装置の構成＞
図２０は、本実施の形態に係るデータ処理装置の構成例を示している。図２０に示すように、本実施の形態では、スキャンダウン部１４０が昇順処理部１４１と降順処理部１４２を含んでいる。昇順処理部１４１は、取得部１２０が取得したスキャンデータに対し、入力データを昇順にソートするスキャンダウン処理を行う。降順処理部１４２は、取得部１２０が取得したスキャンデータに対し、入力データを降順にソートするスキャンダウン処理を行う。
【０１６０】
＜デュアルスキャン方式のグルーピングソート処理の動作例＞
図２１Ａ及び図２１Ｂは、本実施の形態に係るデータ処理の動作例を示している。図２１Ａ及び図２１Ｂは、昇順ソートと降順ソートを同時に行うデュアルスキャン方式のグルーピングソート処理の例である。昇順ソートと降順ソートの処理は、基本的に実施の形態１と同様である。図２１Ａ及び図２１Ｂの例では、図９Ａ及び図９Ｂと同じ４レコードのデータが入力される。また、スキャンデータ、昇順及び降順のマスクデータは４ビットである。
【０１６１】
図２１Ａに示すように、１回目のスキャンダウン処理において、マスタマスクの初期値は“１１１１”であり（Ｓ８０１）、同じマスタマスクで昇順ソート及び降順ソートを行う。ビット列［３］のビットスキャン処理では、昇順ソートのマスク結果が“１１０１”となり（Ｓ８０２ａ）、降順ソートのマスク結果が“００１０”となる（Ｓ８０２ｂ）。ビット列［２］のビットスキャン処理では、昇順ソートのマスク結果が“１００１”となり（Ｓ８０３ａ）、降順ソートのマスク結果がオール０（“００００”）となる（Ｓ８０３ｂ）。ビット列［１］のビットスキャン処理では、昇順ソートのマスク結果が“１０００”となり（Ｓ８０４ａ）、降順ソートのマスク結果が“００１０”となる（Ｓ８０４ｂ）。ビット列［０］のビットスキャン処理では、昇順ソートのマスク結果が“１０００”となり（Ｓ８０５ａ）、降順ソートのマスク結果がオール０となる（Ｓ８０５ｂ）。
【０１６２】
１回目のスキャンダウン処理では、昇順ソートの結果は、ビット列［０］のマスク結果“１０００”となり（Ｓ８０６ａ）、降順ソートの結果は、ビット列［１］のマスク結果“００１０”となる（Ｓ８０６ｂ）。すなわち、“１０００”のＯＮビットのレコード番号０が最小値のデータとして出力され、“００１０”のＯＮビットのレコード番号２が最大値のデータとして出力される。
【０１６３】
また、現在のマスタマスク“１１１１”と１回目の昇順ソート結果をＮＯＴ演算した結果“０１１１”とをマスクし、そのマスク結果“０１１１”と１回目の降順ソート結果をＮＯＴ演算した結果“１１０１”とをマスクし、そのマスク結果“０１０１”を、次の２回目のスキャンダウン用の新しいマスタマスクとする（Ｓ８０７）。
【０１６４】
次に、２回目のスキャンダウン処理では、新しいマスタマスク“０１０１”を用いて（Ｓ８１１）、レコード番号１、３のデータをソート対象として、１回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列［３］のビットスキャン処理では、昇順ソートのマスク結果は“０１０１”となり（Ｓ８１２ａ）、降順ソートのマスク結果はオール０となる（Ｓ８１２ｂ）。ビット列［２］のビットスキャン処理では、昇順ソートのマスク結果は“０００１”となり（Ｓ８１３ａ）、降順ソートのマスク結果は“０１００”となる（Ｓ８１３ｂ）。ビット列［１］のビットスキャン処理では、昇順ソートのマスク結果はオール０となり（Ｓ８１４ａ）、降順ソートのマスク結果はオール０となる（Ｓ８１４ｂ）。ビット列［０］のビットスキャン処理では、昇順ソートのマスク結果はオール０となり（Ｓ８１５ａ）、降順ソートのマスク結果は“０１００”となる（Ｓ８１５ｂ）。
【０１６５】
２回目のスキャンダウン処理では、昇順ソートの結果は、ビット列［２］のマスク結果“０００１”となり（Ｓ８１６ａ）、降順ソートの結果は、ビット列［０］のスキャンデータのマスク結果“０１００”となる（Ｓ８１６ｂ）。すなわち、“０００１”のＯＮビットのレコード番号３が２番目に小さいデータとして出力され、“０１００”のＯＮビットのレコード番号１が２番目に大きいデータとして出力される。
【０１６６】
また、現在のマスタマスク“０１０１”と２回目の昇順ソート結果をＮＯＴ演算した結果“１１１０”とをマスクし、そのマスク結果“０１００”と２回目の降順ソート結果をＮＯＴ演算した結果“１０１１”とをマスクし、そのマスク結果が“００００”となり、全ビットがオフのため、処理を終了する（Ｓ８１７）。
【０１６７】
図２１Ａ及び図２１Ｂの例では、１回目のソート処理の結果は、昇順及び降順ソート個数＝２、昇順ソートレコード番号＝(０）、降順ソートレコード番号＝(２）となり、２回目のソート処理の結果は、昇順及び降順ソート個数＝２、昇順ソートレコード番号＝(３）、降順ソートレコード番号＝(１）となり、最終的なソート処理結果は、昇順及び降順ソート個数＝４、昇順ソートレコード番号＝（０)，(３）、降順ソートレコード番号＝(２)，(１）となる。なお、昇順ソートと降順ソートのループ回数が奇数で終わる場合、最後の処理結果で昇順と降順に同じ値が得られるため、この場合はいずれか一方を採用する。
【０１６８】
＜本実施の形態の効果＞
以上のように、本実施の形態では、スキャンダウンによるグルーピングソート処理において、昇順のグルーピングソートと降順のグルーピングソートを同時に行う。マスタマスクを昇順ソートと降順ソートの２系統で使用しスキャンすることで、昇順ソートのスキャン結果と降順ソートのスキャン結果を一回のスキャンダウンで同時に求めることができる。昇順ソートと降順ソートの２つの処理を同時に行うため、単純にグルーピングを行う処理ループの回数を半分に減らすことができる。
【０１６９】
（実施の形態６）
次に、実施の形態６について説明する。本実施の形態では、実施の形態１〜５のデータ処理装置において、マスク結果をスタックする例について説明する。
【０１７０】
＜データ処理装置の構成＞
図２２は、本実施の形態に係るデータ処理装置の構成例を示している。図２２に示すように、本実施の形態に係るデータ処理装置１００は、実施の形態１の構成に加えて、スタック部１３３を備えている。スタック部１３３は、スキャンダウン部１４０におけるビットスキャン処理のマスク結果とスキャン位置をスタックする。また、スキャンダウン部１４０は、スタックされたマスク結果に対応するスキャン位置からスキャンダウン処理を開始する。
【０１７１】
＜スタック方式の昇順のグルーピングソート処理の処理フロー＞
図２３は、本実施の形態に係るデータ処理方法のフローチャートを示している。図２３は、マスク結果をスタックするスタック方式のグルーピングソート処理を昇順に行う場合の例である。
【０１７２】
図２３に示すように、まず、データ処理装置１００は、初期化処理として、スタックレベル変数（ＳｔａｃｋＬｅｖｅｌ）を０に初期化し、スタックの先頭であるレベル０のスタックマスク値にマスタマスク（Ｍａｓｋ）を、スタックスキャン位置にＭＳＢ位置を設定する（Ｓ９０１）。なお、この例では、スタックにはスタックマスク値（Ｓｔａｃｋ［］．ｍａｓｋ）とスタックスキャン位置（Ｓｔａｃｋ［］．ｐｏｓ）の2つの項目が含まれるものとして説明する。
【０１７３】
次に、データ処理装置１００は、スキャンダウン処理を開始するため、マスクデータである変数Ａにスタックレベルのスタックマスク値を設定し、変数Ｐに同じスタックのスタックスキャン位置を設定する（Ｓ９０２）。次にデータ処理装置１００は、変数ＰがＬＳＢ以上であるかを判定する（Ｓ９０３）。すなわち、スキャン動作がＬＳＢに到達していない場合はＳ９０４に進み、ＬＳＢまで処理を終えた場合はＳ９１０に進む。
【０１７４】
次に、データ処理装置１００は、昇順ソートのマスク処理として、Ｐビット列のスキャンデータのＮＯＴ演算結果とマスクデータである変数ＡとをＡＮＤ演算し、その演算結果をマスク結果である変数Ｂに設定する（Ｓ９０４）。
次に、データ処理装置１００は、スキャン位置である変数Ｐをデクリメントする。すなわち、スキャン位置をＬＳＢ側に移動する。（Ｓ９０５）
【０１７５】
次に、データ処理装置１００は、マスク処理結果である変数Ｂが０か否か、すなわち、絞り込みが成功したか、もしくは、変数Ｂが変数Ａと同じか否か、すなわち、ビットスキャンによりマスクが変化したか否かを判定する（Ｓ９０６）。
【０１７６】
Ｓ９０６でマスク処理結果である変数Ｂが０以外、かつ変数Ｂが変数Ａと異なる場合、すなわち、絞り込みが成功し、マスクの変化が起こった場合、データ処理装置１００は、スタックレベルのスタックマスク値に変数Ａを設定し、同じスタックのスタックスキャン位置に変数Ｐを設定する（Ｓ９０７）。その後、スタックレベル変数をインクリメントする（Ｓ９０８）。さらに、マスクデータである変数Ａをマスク結果である変数Ｂにより更新し（Ｓ９０９）、Ｓ９０３以降で次のビット列に対するビットスキャン処理を繰り返す。
【０１７７】
また、Ｓ９０３で変数Ｐが０より下になった場合、すなわち、全ビットのスキャンが終了した場合、データ処理装置１００は、Ｓ９０９で更新されたマスクデータである変数Ａを結果として出力する（Ｓ９１０）。次に、データ処理装置１００は、マスタマスクとマスクデータである変数ＡのＮＯＴの結果をＡＮＤ演算し、その演算結果によりマスタマスクを更新する（Ｓ９１１）。
【０１７８】
次に、データ処理装置１００は、更新したマスタマスクが０か否か、すなわち、全データ処理が終了したか否か判定する（Ｓ９１２）。Ｓ９１２でマスタマスクが０以外の場合、すなわち、全データ処理が終了していない場合、データ処理装置１００は、スタックレベル変数をデクリメントし（Ｓ９１３）、そのスタックレベルのスタックマスク値とマスタマスクとをＡＮＤ演算し、その結果で同じスタックマスクを更新する（Ｓ９１４）。その後、Ｓ９０２以降で、スタックされたスタックマスク値とスタックスキャン位置を用いて、スキャンダウン処理を繰り返す。また、Ｓ９１２でマスタマスクが０の場合、すなわち、全データ処理が終了した場合、処理を終了する。
【０１７９】
以上のように、本実施の形態では、前記に示したビットスキャンによるスキャンダウンの途中経過をスタックに蓄積していくことにより、次の回のスキャンダウン開始位置を、ＭＳＢ位置でなく、変化が生じる最も低いビット列の位置から開始することが出来る。
【０１８０】
なお、実施の形態１の図４と同様に、処理結果の早期検出を行ってもよい。すなわち、Ｓ９０９の後、変数ＡのＯＮビットが一つのみか否か判定し、変数ＡのＯＮビットが一つのみではない場合はＳ９０３に進み、変数ＡのＯＮビットが一つのみの場合はＳ９１０に進んでもよい。また、実施の形態１の図６と同様に、降順ソートを行う場合、Ｓ９０４において、Ｐビット列のスキャンデータと変数ＡとをＡＮＤ演算し、そのＡＮＤ演算の結果を変数Ｂに設定してもよい。
【０１８１】
＜スタック方式の昇順のグルーピングソート処理の動作例＞
図２４Ａ及び図２４Ｂは、本実施の形態に係るデータ処理の動作例を示している。図２４Ａ及び図２４Ｂは、図２３に示したようにスタック方式のグルーピングソート処理を昇順に行う場合の例である。図２４Ａ及び図２４Ｂの例では、レコード番号０〜３の４レコードのデータが入力される。レコード番号０のデータ値が１５、レコード番号１のデータ値が２、レコード番号２のデータ値が１４、レコード番号３のデータ値が５である。各データはビット列［０］〜［３］の４ビットデータであり、スキャンデータ及びマスクデータも４ビットである。
【０１８２】
図２４Ａに示すように、最初に、処理の開始に伴うスタックの初期化を行う。具体的には、スタックレベルを“０”に設定し、スタック［０］のスタックマスク値にマスタマスクである“１１１１”を設定し、スタックスキャン位置にＭＳＢ位置である“３”を設定する（Ｓ１００１）。
【０１８３】
スキャンダウン処理では、まず、スタックレベル“０”の位置に当たるスタック［０］からスタックスキャン位置の“３”と、スタックマスクである“１１１１”を取得し、各々スキャン位置とマスクデータに設定する（Ｓ１００２）。
【０１８４】
次に、取得した“１１１１”をマスクデータとして、スキャン位置“３”に当たるビット列［３］をビットスキャンすることで、マスク結果が“０１０１”となり、スキャン位置はデクリメントすることで“２”となる（Ｓ１００３）。この処理により、マスク結果が０ではなく、かつ、マスクデータの“１１１１”とも同じではないため、現在のスタックレベルである“０”の指すスタック［０］のスタックマスクにマスクデータ“１１１１”を設定し、スタックスキャン位置に、現在のスキャン位置である“２”を設定する。つまり、この時点で、Ｓ１００１でスタック［０］に設定した初期値を、上書きにより更新する。その後、スタックレベルをカウントアップして“１”にし、マスクデータをマスク結果である“０１０１”に更新する（Ｓ１００４）。
【０１８５】
次に、“０１０１”をマスクデータとして、スキャン位置“２”に当たるビット列［２］をビットスキャンすることで、マスク結果が“０１００”となり、スキャン位置はデクリメントすることで“１”となる（Ｓ１００５）。この処理により、マスク結果が０ではなく、かつ、マスクデータの“０１０１”とも同じではないため、現在のスタックレベルである“１”の指すスタック［１］のスタックマスクとしてマスクデータ“０１０１”を設定し、スタックスキャン位置に現在のスキャン位置である“１”を設定する。その後、スタックレベルをカウントアップして“２”にし、マスクデータをマスク結果である“０１００”に更新する（Ｓ１００６）。
【０１８６】
次に、“０１００”をマスクデータとして、スキャン位置“１”に当たるビット列［１］をビットスキャンすることで、マスク結果がオール０（“００００”）となり、スキャン位置はデクリメントすることで“０”となる。このとき、マスク結果が０のため、スタック処理と、マスクデータの更新は行わず次のビットスキャン処理に移る（Ｓ１００７）。
【０１８７】
次のビットスキャンでは、引き継いだ“０１００”をマスクデータとして、スキャン位置“０”に当たるビット列［０］をビットスキャンすることで、マスク結果が“０１００”となり、スキャン位置はデクリメントすることで“−１”となる。このとき、マスク結果が０ではないが、マスクデータと同じであるため、スタック処理と、マスクデータの更新は行わず次の処理に移る（Ｓ１００８）。
【０１８８】
１回目のスキャンダウン処理の結果は、最終的なマスクデータである“０１００”となる（Ｓ１００９）。すなわち、“０１００”のＯＮビットのレコード番号１が最小値のデータとして出力される。また、現在のマスタマスク“１１１１”と１回目のスキャンダウン処理の結果をＮＯＴ演算した“１０１１”とのマスクにより、次の２回目のスキャンダウン用の新しいマスタマスクを“１０１１”とする（Ｓ１０１０）。さらに、スタックレベルを一つ戻して“１”とし、新しいマスタマスク“１０１１”と、戻したスタックレベル“１”の指すスタック［１］のスタックマスク“０１０１”とをＡＮＤし、その演算結果“０００１”によって同スタックマスクの値を更新する（Ｓ１０１１）。
【０１８９】
次に、２回目のスキャンダウン処理は、現在のスタックレベル“１”の指すスタック［１］に格納されているスタックスキャン位置“１”をスキャン位置とし、スタックマスク“０００１”をマスクデータとして開始する（Ｓ１０１６）。最初のビット列［１］に対するマスク結果は“０００１”となり、このとき、マスク結果が０ではないが、マスクデータ“０００１”と同じため、スタック処理はされず、マスクデータの更新もされない（Ｓ１０１７）。
【０１９０】
次に、ビット列［０］のビットスキャン処理では、引き継いだマスクデータ“０００１”をマスクデータとして、マスク結果がオール０となり、マスク結果が０であるため、スタック処理はされず、マスクデータの更新もされない（Ｓ１０１８）。
【０１９１】
２回目のスキャンダウン処理の結果は、最終的に引き継いだマスクデータである“０００１”となる（Ｓ１０１９）。すなわち、“０００１”のＯＮビットのレコード番号３が２番目に小さいデータとして出力される。また、現在のマスタマスク“１０１１”と２回目のスキャンダウン処理結果をＮＯＴ演算した結果“１１１０”とのマスクにより、次の３回目のスキャンダウン用の新しいマスタマスクを“１０１０”とする（Ｓ１０２０）。さらに、スタックレベルを一つ戻して“０”とし、新しいマスタマスク“１０１０”と戻したスタックレベル“０”の指すスタック［０］のスタックマスク“１１１１”とをＡＮＤし、そのマスク結果“１０１０”によって同スタックマスクの値を更新する（Ｓ１０２１）。
【０１９２】
次に、３回目のスキャンダウン処理は、現在のスタックレベル“０”の指すスタック［０］に格納されているスタックスキャン位置“２”をスキャン位置とし、スタックマスク“１０１０”をマスクデータとして開始する（Ｓ１０２４）。最初のビット列［２］に対するマスク結果はオール０となり、マスク結果が０のため、スタック処理はされず、マスクデータの更新もされない（Ｓ１０２５）。
【０１９３】
次に、ビット列［１］のビットスキャン処理では、引き継いだマスクデータ“１０１０”をマスクデータとして、マスク結果がオール０となり、マスク結果が０であるため、スタック処理はされず、マスクデータの更新もされない（Ｓ１０２６）。
【０１９４】
次に、ビット列［０］のビットスキャン処理では、引き継いだマスクデータ“１０１０”をマスクデータとして、マスク結果が“００１０”となる（Ｓ１０２７）。このとき、マスク結果が０ではなく、かつ、マスクデータの“１０１０”とも同じではないため、現在のスタックレベルである“０”の位置に当たる、スタック［０］のスタックマスクとしてマスクデータ“１０１０”を設定し、スタックスキャン位置に現在のスキャン位置(今回のビット列［０］のスキャン後デクリメントしたため−１に成っている。)である“−１”を設定する。つまり、この時点で、Ｓ１０２１でスタック［０］に設定した値を、上書きにより更新する。その後、スタックレベルをカウントアップして“１”にし、マスクデータをマスク結果である“００１０”に更新する（Ｓ１０２８）。
【０１９５】
３回目のスキャンダウン処理の結果は、最終的なマスクデータである“００１０”となる（Ｓ１０２９）。すなわち、“００１０”のＯＮビットのレコード番号２が３番目に小さいデータとして出力される。また、現在のマスタマスク“１０１０”と３回目のスキャンダウン処理結果をＮＯＴ演算した結果“１１０１”とをマスクし、次の４回目のスキャンダウン用の新しいマスタマスクを“１０００”とする（Ｓ１０３０）。さらに、スタックレベルを一つ戻して“０”とし、新しいマスタマスク“１０００”と、戻したスタックレベル“０”の指すスタック［０］のスタックマスク“１０１０”とをＡＮＤし、そのマスク結果“１０００”によって同スタックマスクの値を更新する（Ｓ１０３１）。
【０１９６】
次に、４回目のスキャンダウンは、現在のスタックレベル“０”の指すスタック［０］に格納されているスタックスキャン位置“−１”をスキャン位置とし、スタックマスク“１０００”をマスクデータとして開始する。ここでは、スキャン位置が既に−１であり、ＬＳＢより下の位置を指しているため、ビットスキャンは行われず、マスクデータがそのまま結果となる（Ｓ１０３８）。
【０１９７】
４回目のスキャンダウン処理の結果は、最終的なマスクデータ“１０００”となる（Ｓ１０３９）。すなわち、“１０００”のＯＮビットのレコード番号０が４番目に小さいデータとして出力される。また、現在のマスタマスク“１０００”と４回目のスキャンダウンの結果をＮＯＴ演算した結果“０１１１”をマスクすると、マスク結果が“００００”となり、全ビットがオフのため、処理を終了する（Ｓ１０４０）。図２４Ａ及び図２４Ｂの例では、昇順のグルーピングソート処理の結果は、個数＝４、レコード番号＝(１），(３），（２）、（０）となる。
【０１９８】
＜本実施の形態の効果＞
以上のように、本実施の形態では、スキャンダウンによるグルーピングソート処理において、スキャンダウンの際にマスクが変化した位置をスタックして行くことで、次のスキャンダウン開始位置を、直前のマスク変化位置から開始することができ、効率よく処理を行うことが可能となる。
【０１９９】
すなわち、マスク結果とスキャン位置を積むスタックを用意し、スキャンダウン処理で全ビットが０以外、かつ、前のマスクと変化があった場合に、変化前のマスクとスキャン位置をスタックに積んでいく。処理をＬＳＢまで終えた場合は、スタックを一つ戻し、そこに格納されているマスクと、マスタマスクのＡＮＤを取ったものを新たなマスクとし、スタックに格納されているスキャン位置から次のスキャンダウンを開始する。これにより、最上位からスキャンダウンを開始する必要が無く、処理シーケンススキップ部分の処理量を減らすことができる（図２４Ａの２回目のビット列［３］及びビット列［２］、図２４Ｂの３回目のビット列［３］、同４回目のビット列全ての処理）。特に全体ビット桁数に比べ、有効ビット桁数が少ない場合に有効である。
【０２００】
図２５は、実施の形態１における基本グルーピングソート方式と本実施の形態におけるスタック方式の処理の比較を示している。基本グルーピングソート方式のソートでは、値が例に示す（２，５，１４，１５）だった場合、図２５（ａ）のように各スキャンダウン（Ｐ１〜Ｐ４）で先頭ビット（ＭＳＢ）から最下位ビット（ＬＳＢ）までのスキャンが必要になる。この例では、各スキャンダウンで５回の処理（ビットスキャン処理）となるため、全データをソートするためには２０回の処理が必要になる。これに対し、スタック方式の場合は、図２５（ｂ）のように直前の分岐位置からスキャンダウンを行うため、ＭＳＢからＬＳＢまで全ビットをスキャンする必要がない。そうすると、この例では、スキャンダウン順に、Ｐ１＝５回、Ｐ２＝３回、Ｐ３＝４回、Ｐ４＝０回の処理となり、全データのソートを１２回の処理で行うことができる。例えば、全体のビット数に比べ有効ビットが少ない場合や、絞り込みの結果、データに偏りが生じた場合などに効率よく処理することができる。なお、処理結果の早期検出を行う場合、さらに処理回数を減らすことができ、図２５（ｂ）では、Ｐ1のビット列［１］及びビット列［０］、Ｐ２のビット列［１］及びビット列［０］のスキャンダウン自体も不要になる。
【０２０１】
（実施の形態７）
次に、実施の形態７について説明する。本実施の形態では、実施の形態１〜５のデータ処理装置において、グルーピング結果に対し、ビットカウントにより積算を行う例について説明する。
【０２０２】
＜データ処理装置の構成＞
図２６は、本実施の形態に係るデータ処理装置の構成例を示している。図２６に示すように、本実施の形態に係るデータ処理装置１００は、実施の形態１の構成に加えて、ビットカウント部１６０、積算部１６１を備えている。
【０２０３】
ビットカウント部１６０は、グルーピング処理結果のＯＮビットをカウント（ビットカウント）するビットカウント処理を行う。また、グルーピング結果と複数のスキャンデータとをマスクした結果のビットをビットカウントする。例えば、処理結果マスクが“１１０１１１１０”の場合、ビットカウント処理では、この結果マスクのＯＮビットをカウントし、ビットカウント結果は６となる。
【０２０４】
積算部１６１は、ビットカウント結果を用いて、グルーピングされたデータの積算処理を行う。積算部１６１は、マスク結果のビットカウント値に応じた値を積算する。具体的には、ビットカウント値をスキャンデータのビット位置に応じてビットシフトし、ビットシフトした値を合計する。なお、データ処理装置１００は、少なくとも、ビットカウント部１６０と積算部１６１を備え、入力される複数のデータに対しビットカウント処理と積算処理を行ってもよい。
【０２０５】
＜ビットカウントによる積算処理の処理フロー＞
図２７は、本実施の形態に係るデータ処理方法のフローチャートを示している。図２７は、ビットカウントを使った積算処理の例である。例えば、以下の処理は主に積算部１６１により実行され、ビットカウントの処理がビットカウント部１６０により実行されるが、これに限られない。
【０２０６】
図２７に示すように、まず、データ処理装置１００は、積算処理の初期設定として、積算結果を０に初期化し、変数ＰにＭＳＢ位置を設定する（Ｓ１１０１）。次に、データ処理装置１００は、積算結果を左に１ビットシフトする（Ｓ１１０２）。
【０２０７】
次に、データ処理装置１００は、マスタマスク（Ｍａｓｋ）とＰビット列の積算ビットデータとをＡＮＤ演算し、そのＡＮＤ演算の結果を変数Ｂに設定する（Ｓ１１０３）。積算ビットデータは、積算対象のデータの各ビット列データ（スキャンデータ）である。
【０２０８】
次に、データ処理装置１００は、マスク結果である変数Ｂをビットカウントし、そのビットカウント結果を積算結果に加算し、その加算結果により積算結果を更新する（Ｓ１１０４）。次に、データ処理装置１００は、処理中のビット列である変数ＰがＬＳＢか否か、すなわち、全ビットのスキャンが終了したか否か判定する（Ｓ１１０５）。
【０２０９】
Ｓ１１０５で変数ＰがＬＳＢ以外の場合、すなわち、全ビットのスキャンが終了していない場合、データ処理装置１００は、次のスキャンのために、変数ＰをＬＳＢ側に一つ移動し（Ｓ１１０６）、Ｓ１１０２以降の処理を繰り返す。また、Ｓ１１０５で変数ＰがＬＳＢである場合、すなわち、全ビットのスキャンが終了した場合、データ処理装置１００は、積算結果を出力する（Ｓ１１０７）。
【０２１０】
＜ビットカウントによる積算処理の動作例＞
図２８は、本実施の形態に係るデータ処理の動作例を示している。図２８は、図２７のようにビットカウントを使って積算処理を行う例である。
【０２１１】
図２８の例では、レコード番号０〜７の８レコードのデータが入力される。レコード番号０のデータ値が０、レコード番号１のデータ値が５、レコード番号２のデータ値が１０、レコード番号３のデータ値が３、レコード番号４のデータ値が２、レコード番号５のデータ値が６、レコード番号６のデータ値が８、レコード番号７のデータ値が９である。
【０２１２】
例えば、図１４で示した小なりイコールの検索処理と同様に、ビット列［３］〜［０］をスキャンし、８以下のデータを検索すると、処理結果マスク“１１０１１１１０”が得られる（Ｓ１２００）。
【０２１３】
まず、積算結果の初期値は０であり、左に１ビットシフトしても０である（Ｓ１２０１）。また、ビット列［３］のスキャンデータ“００１０００１１”を処理結果マスクによりマスクすると、マスク結果が“００００００１０”となり、このマスク結果をビットカウントすると１となる（Ｓ１２０２）。このビットカウント結果を積算結果に加えると、“００００１”（＝１）となる（Ｓ１２０３）。
【０２１４】
次に、現在の積算結果を１ビット左にシフトすると、“０００１０”（＝２）となる（Ｓ１２０４）。また、ビット列［２］のスキャンデータ“０１０００１００”を処理結果マスクによりマスクすると、マスク結果が“０１０００１００”となり、このマスク結果をビットカウントすると２となる（Ｓ１２０５）。このビットカウント結果を積算結果に加えると、“００１００”（＝４）となる（Ｓ１２０６）。
【０２１５】
次に、現在の積算結果を１ビット左にシフトすると、“０１０００”（＝８）となる（Ｓ１２０７）。また、ビット列［１］のスキャンデータ“００１１１１００”を処理結果マスクによりマスクすると、マスク結果が“０００１１１００”となり、このマスク結果をビットカウントすると３となる（Ｓ１２０８）。このビットカウント結果を積算結果に加えると、“０１０１１”（＝１１）となる（Ｓ１２０９）。
【０２１６】
次に、現在の積算結果を１ビット左にシフトすると、“１０１１０”（＝２２）となる（Ｓ１２１０）。また、ビット列［０］のスキャンデータ“０１０１０００１”を処理結果マスクによりマスクすると、マスク結果が“０１０１００００”となり、このマスク結果をビットカウントすると２となる（Ｓ１２１１）。このビットカウント結果を積算結果に加えると、最終的な積算結果は“１１０００”（＝２４）となる（Ｓ１２１２）。
【０２１７】
図２９は、本実施の形態に係るデータ処理の他の動作例を示している。図２９は、各ビット列でビットカウントを行い、最後に積算する例である。入力されるデータ及び処理結果マスクは図２５と同じである。
【０２１８】
まず、図２８と同様に、ビット列［３］のスキャンデータを処理結果マスクによりマスクし、そのマスク結果をビットカウントすると１となる（Ｓ１２０２）。この積算方法では、ビット位置に応じてビットカウント値を左にシフトする。このときビット列［３］のため、このビットカウント結果“１”を３ビット左にシフトすると、“０００１０００”（＝８）となる（Ｓ１２２１）。
【０２１９】
次に、ビット列［２］のスキャンデータを処理結果マスクによりマスクし、そのマスク結果をビットカウントすると２となる（Ｓ１２０５）。このときビット列［２］のため、このビットカウント結果“２”を２ビット左にシフトすると、“０００１０００”（＝８）となる（Ｓ１２２２）。
【０２２０】
次に、ビット列［１］のスキャンデータを処理結果マスクによりマスクし、そのマスク結果をビットカウントすると３となる（Ｓ１２０８）。このときビット列［１］のため、このビットカウント結果“３”を１ビット左にシフトすると、“００００１１０”（＝６）となる（Ｓ１２２３）。
【０２２１】
次に、ビット列［０］のスキャンデータを処理結果マスクによりマスクし、そのマスク結果をビットカウントすると２となる（Ｓ１２１１）。このときビット列［０］のため、このビットカウント結果“２”を０ビット左にシフトすると（シフトしないのと同じ）、“０００００１０”（＝２）となる（Ｓ１２２４）。
【０２２２】
次に、ビット列［３］のビットカウント値のシフト結果“８”、ビット列［２］のビットカウント値のシフト結果“８”、ビット列［１］のビットカウント値のシフト結果“６”、ビット列［０］のビットカウント値のシフト結果“２”を合計すると、積算結果“２４”となる（Ｓ１２２５）。本処理を使用しない一般的な積算方法では、０＋５＋３＋２＋６＋８＝２４となるのに対し、本処理では、８＋８＋６＋２により同じ結果を得ることができる。
【０２２３】
＜本実施の形態の効果＞
以上のように、本実施の形態では、ビットカウントを使用して積算処理を行い、縦展開されたデータに対し高速な演算処理を可能とする。この方式では、各データの、横方向のビット列に対して、ビットカウントを求め、その結果をシフトしながら加算することで、積算を行う。この方式の計算量は、Ｏ（ｎ／ビットカウント幅＊データビットサイズ）となる。大量データに対し、ビットカウントを行う幅が広くなる、もしくは、有効データビットサイズが小さくなるに従い、計算は高速化される。
【０２２４】
例えば、８ビットサイズ×２５６データに対し積算を行う場合、本方式を使用しない通常加算では２５６回の加算が必要となるが、本方式の２５６ビットのビットカウント型積算では、ＡＮＤ操作×８回＋ビットカウント×８回＋シフト×８回＋加算×８回＝３２回の演算で完了する。
【０２２５】
実施の形態１〜６のようにグルーピングを行う際には、そのグループに属するデータのレコード数ならびに、そのグループの特定のフィールドの積算（Ｓｕｍ）値を同時に取得することが多い。上記のように、グループに属するレコード数のカウント処理は、単純にビットカウントにより結果マスクのＯＮビット数（１のビットの数）を数えることによって得られる。本実施の形態の積算処理をグルーピングの演算結果に適用することで、効率よく積算結果を求めることができる。例えば、実施の形態１のグルーピングソート処理において積算を行う場合、図３のＳ１０７の後に、図２７の積算処理を行う。
【０２２６】
なお、レコード数のカウント処理と積算処理は結果マスクと積算を行うフィールドが決まれば実施することができるため、グルーピングの結果に限らず、全件積算や通常の絞り込み（検索）の結果に対しても適用できる。また、積算値とレコード数が求められれば、（積算値÷レコード数）を求めることで、平均値も容易に求めることができる。従って、平均値を使う分散や標準偏差などの計算にもこの処理を活用することができる。
【０２２７】
（実施の形態８）
次に、実施の形態８について説明する。本実施の形態では、実施の形態１〜７のデータ処理装置において、複数のテーブルのデータに対しＪＯＩＮ処理を行う例について説明する。
【０２２８】
＜データ処理装置の構成＞
図３０は、本実施の形態に係るデータ処理装置の構成例を示している。図３０に示すように、本実施の形態に係るデータ処理装置１００は、実施の形態１の構成に加えて、ＪＯＩＮ処理部１７０を備えている。なお、データ処理装置１００は、少なくとも、ＪＯＩＮ処理部１７０を備え、ＪＯＩＮ処理のみを行ってもよい。
【０２２９】
ＪＯＩＮ処理部１７０は、２つのテーブルに対しＪＯＩＮ処理を行う。ＪＯＩＮ処理とは、２つのデータ集合を特定のキーを使って結合し、双方のレコードの対応を取る処理である。ＪＯＩＮ処理には、ＦｕｌｌＯｕｔｅｒ−ＪＯＩＮ、ＬｅｆｔＯｕｔｅｒ−ＪＯＩＮ、ＲｉｇｈｔＯｕｔｅｒ−ＪＯＩＮ、Ｉｎｎｅｒ−ＪＯＩＮが含まれる。
【０２３０】
ＦｕｌｌＯｕｔｅｒ−Ｊｏｉｎの場合、２つのテーブルのＪＯＩＮキーを合わせて、グルーピング動作を行うことにより、２つのテーブルの全てのレコードを出力する。この際、双方のＪＯＩＮキーの同一のレコードは、一つのグループ（ＪＯＩＮされた状態）として出力する。
【０２３１】
ＬｅｆｔＯｕｔｅｒ−Ｊｏｉｎの場合、左側（一方）のテーブルでグルーピング動作を行い、その結果出力された、データのＪＯＩＮキーを使い、右側（他方）のテーブルを検索する。検索の結果、右側のテーブルに同じＪＯＩＮキーのデータが存在すれば、左側のテーブルのグルーピング結果に、該当レコードを追加（ＪＯＩＮされた状態）して出力する。ＲｉｇｈｔＯｕｔｅｒ−Ｊｏｉｎの場合、ＬｅｆｔＯｕｔｅｒ−Ｊｏｉｎの左と右のテーブルの操作が逆になる。
【０２３２】
Ｉｎｎｅｒ−Ｊｏｉｎの場合、最初に、左右のテーブル各々に対し、各々グルーピングする。左右のテーブルのグルーピングキーの値が異なる場合は、小さいキーを出力したテーブルに対し、大きいほうのグルーピングキーをポジショナルグルーピングの「以上」の絞り込み値に指定してポジショナルグルーピングを行う。両方のテーブルのグルーピングキーに同じ値が得られた場合は、その両方を合わせて（ＪＯＩＮされた状態）出力し、左右のテーブル各々に対し、各々次のグルーピングを得る。この動作を、いずれかのテーブルのデータが無くなるまで繰り返す。
【０２３３】
＜Ｉｎｎｅｒ−Ｊｏｉｎの処理フロー＞
図３１は、本実施の形態に係るデータ処理に含まれるＩｎｎｅｒーＪＯＩＮ処理のフローチャートを示している。この例では、テーブルＡとテーブルＢに対しＪＯＩＮ処理を行う。
【０２３４】
図３１に示すように、まず、データ処理装置１００は、テーブルＡとテーブルＢの各々の基本グルーピング結果を取得（昇順、取得件数＝１）する（Ｓ１３０１）。例えば、実施の形態２のように、昇順の基本グルーピングソートにより、各テーブルのデータをグルーピングし、指定された件数（１件）のデータを取得する。
【０２３５】
次に、データ処理装置１００は、両方のテーブルのグルーピング値が求まっているか（グルーピング結果があるか）否か判定する（Ｓ１３０２）。Ｓ１３０２で両方のテーブルのグルーピング値が求まっていない場合、データ処理装置１００は処理を終了する。また、Ｓ１３０２で両方のテーブルのグルーピング値が求まっている場合、データ処理装置１００は、両方のテーブルのグルーピング値が同じか否か判定する（Ｓ１３０３）。
【０２３６】
Ｓ１３０３で両方のテーブルのグルーピング値が同じ場合、データ処理装置１００は、両方のテーブルのグルーピング結果を合わせて出力（Ｊｏｉｎ結果出力）する（Ｓ１３０４）。次に、データ処理装置１００は、テーブルＡとテーブルＢの各々の次の基本グルーピング結果を取得（昇順、取得件数＝１）し（Ｓ１３０５）、その後、Ｓ１３０２以降を繰り返す。
【０２３７】
また、Ｓ１３０３で両方のテーブルのグルーピング値が異なる場合、データ処理装置１００は、テーブルＡのグルーピング値がテーブルＢのグルーピング値より小さいか否か判定する（Ｓ１３０６）。Ｓ１３０６でテーブルＡのグルーピング値がテーブルＢのグルーピング値より小さい場合、データ処理装置１００は、テーブルＢのグルーピング値によりテーブルＡをポジショナルグルーピングする（Ｓ１３０７）。すなわち、テーブルＢのグルーピング値を絞り込み開始データに指定し、テーブルＡを「以上（大なりイコール）」の条件でポジショナルグルーピング（昇順、取得件数＝１）し、その後、Ｓ１３０２以降を繰り返す。ポジショナルグルーピングは、実施の形態３のように、グルーピングの最初に、絞り込み動作（昇順の場合は、より大きいもしくは以下、降順の場合は、より小さいもしくは以下）を加えた、任意の位置を開始点とするグルーピング処理である。
【０２３８】
また、Ｓ１３０６でテーブルＡのグルーピング値がテーブルＢのグルーピング値以上の場合、データ処理装置１００は、テーブルＡのグルーピング値によりテーブルＢをポジショナルグルーピングする（Ｓ１３０８）。すなわち、テーブルＡのグルーピング値を絞り込み開始データに指定し、テーブルＢを「以上（大なりイコール）」の条件でポジショナルグルーピング（昇順、取得件数＝１）し、その後、Ｓ１３０２以降を繰り返す。
【０２３９】
＜ＪＯＩＮ処理の動作例＞
図３２は、本実施の形態に係るデータ処理であるＪＯＩＮ処理の動作例を示している。図２９の例では、テーブルＡには、１（Ａ１），２（Ａ２），４（Ａ４），５（Ａ５），６（Ａ６）のデータが格納され、テーブルＢには、２（Ｂ２），３（Ｂ３），６（Ｂ６）のデータが格納されている。なお、説明の簡略化のため、各テーブルに各値のデータが一つしか含まれていないが、同値のデータが複数ある場合は、グルーピング動作により同値のデータが同時検出される。
【０２４０】
図３２（ａ）に示すように、ＦｕｌｌＯｕｔｅｒ−ＪＯＩＮの場合、テーブルＡとテーブルＢのＪｏｉｎカラムを同一位置に配置し、全体を対象に基本グルーピングを行う。ＦｕｌｌＯｕｔｅｒ−ＪＯＩＮの結果は、ＪＯＩＮ個数＝６、ＪＯＩＮデータ＝（Ａ１）、（Ａ２，Ｂ２）、（Ｂ３）、（Ａ４）、（Ａ５）、（Ａ６，Ｂ６）となる。
【０２４１】
図３２（ｂ）に示すように、ＬｅｆｔＯｕｔｅｒ−ＪＯＩＮの場合、テーブルＡでまず基本グルーピングを行い、テーブルＡのグルーピング結果を使って、テーブルＢを同値検索する。ＬｅｆｔＯｕｔｅｒ−ＪＯＩＮの結果は、ＪＯＩＮ個数＝５、ＪＯＩＮデータ＝（Ａ１）、（Ａ２，Ｂ２)、（Ａ４）、（Ａ５）、（Ａ６,Ｂ６）となる。
【０２４２】
図３２（ｃ）に示すように、ＲｉｇｈｔＯｕｔｅｒ−ＪＯＩＮの場合、テーブルＢでまず基本グルーピングを行い、テーブルＢのグルーピング結果を使って、テーブルＡを同値検索する。ＲｉｇｈｔＯｕｔｅｒ−ＪＯＩＮの結果は、ＪＯＩＮ個数＝３、ＪＯＩＮデータ＝（Ａ２，Ｂ２)、（Ｂ３）、（Ａ６,Ｂ６）となる。
【０２４３】
図３２（ｄ）に示すように、Ｉｎｎｅｒ−ＪＯＩＮの場合、テーブルＡとテーブルＢでポジショナルグルーピングを行い、同値がある箇所のみ結果を出力する。
【０２４４】
まず、テーブルＡとテーブルＢを各々基本グルーピングし、テーブルＡの結果が１、テーブルＢの結果が２となる（Ｓ１４０１）。次に、Ｓ１４０１の結果ではテーブルＡの値（１）の方が小さいため、テーブルＢの値（２）以上でテーブルＡをポジショナルグルーピングすると、テーブルＡの結果が２となる（Ｓ１４０２）。
【０２４５】
次に、Ｓ１４０２の結果ではテーブルＡとテーブルＢに同じ値（２）が現れるため、グルーピング結果（Ａ２，Ｂ２）を出力し、さらに両テーブルを各々基本グルーピングする（Ｓ１４０３）。次に、Ｓ１４０３の結果ではテーブルＢの値（３）の方が小さいため、テーブルＡの値（４）以上でテーブルＢをポジショナルグルーピングすると、テーブルＢの結果が６となる（Ｓ１４０４）。
【０２４６】
次に、Ｓ１４０４の結果ではテーブルＡの値（４）の方が小さいため、テーブルＢの値（６）以上でテーブルＡをポジショナルグルーピングすると、テーブルＡの結果が６となる（Ｓ１４０５）。次に、Ｓ１４０５の結果ではテーブルＡとテーブルＢに同じ値（６）が現れるため、グルーピング結果（Ａ６、Ｂ６）を出力し、さらに両テーブルを各々基本グルーピングする（Ｓ１４０６）。Ｓ１４０６で新たなグルーピングデータ無しとなり処理を終了する（Ｓ１４０７）。
【０２４７】
＜本実施の形態の効果＞
通常、ＪＯＩＮ処理を高速に行うためにはインデックスの作成を避けては通れない。しかしながら、一般に使われるＢ−Ｔｒｅｅやハッシュインデックスの作成や更新は、序列（ＳＯＲＴ順）の維持や、生成されるハッシュ値の変化による格納位置の変更などの処理を伴うため、生成や更新の処理負荷が大きい。一方、本実施の形態に係るＪＯＩＮ処理では、上記実施の形態におけるグルーピング処理を使用することで、インデックスの作成を前提とせずに、任意のデータ集合をＪＯＩＮすることができ、効率よくＪＯＩＮ処理を行うことができる。
【０２４８】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
【０２４９】
上述の実施形態における各構成は、ハードウェア又はソフトウェア、もしくはその両方によって構成され、１つのハードウェア又はソフトウェアから構成してもよいし、複数のハードウェア又はソフトウェアから構成してもよい。各装置の機能（処理）を、ＣＰＵやメモリ等を有するコンピュータにより実現してもよい。例えば、記憶装置に実施形態における方法を行うためのプログラムを格納し、各機能を、記憶装置に格納されたプログラムをＣＰＵで実行することにより実現してもよい。
【０２５０】
これらのプログラムは、コンピュータに読み込まれた場合に、実施形態で説明された１又はそれ以上の機能をコンピュータに行わせるための命令群（又はソフトウェアコード）を含む。プログラムは、非一時的なコンピュータ可読媒体又は実体のある記憶媒体に格納されてもよい。限定ではなく例として、コンピュータ可読媒体又は実体のある記憶媒体は、random-access memory（RAM）、read-only memory（ROM）、フラッシュメモリ、solid-state drive（SSD）又はその他のメモリ技術、CD-ROM、digital versatile disc（DVD）、Blu-ray（登録商標）ディスク又はその他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージ又はその他の磁気ストレージデバイスを含む。プログラムは、一時的なコンピュータ可読媒体又は通信媒体上で送信されてもよい。限定ではなく例として、一時的なコンピュータ可読媒体又は通信媒体は、電気的、光学的、音響的、またはその他の形式の伝搬信号を含む。
【符号の説明】
【０２５１】
１００    データ処理装置
１１０    記憶部
１２０    取得部
１２１    分割部
１３０    マスク保持部
１３１    マスク退避部
１３２    絞り込み部
１３３    スタック部
１４０、１４０ａ、１４０ｂ  スキャンダウン部
１４１    昇順処理部
１４２    降順処理部
１５０    出力部
１６０    ビットカウント部
１６１    積算部
１７０    ＪＯＩＮ処理部
【要約】
【課題】効率よくデータ処理を行うことが可能なデータ処理装置、データ処理方法、及びプログラムを提供する。
【解決手段】データ処理装置１００は、複数のＮビットの入力データにおける同じビット位置のビットデータを含むスキャンデータを、ビット位置順に取得する取得部１２０と、取得されるスキャンデータを用いてビットスキャン処理を行い、第１のビット位置のスキャンデータから第Ｎのビット位置のスキャンデータまでビットスキャン処理を繰り返すスキャンダウン処理を行うスキャンダウン部１４０と、スキャンダウン処理ごとに得られる同値の入力データをソート順に逐次出力する出力部１５０と、を備える。
【選択図】図１【図１】
0006986309.tif 000002
【図２】
0006986309.tif 000003
【図３】
0006986309.tif 000004
【図４】
0006986309.tif 000005
【図５Ａ】
0006986309.tif 000006
【図５Ｂ】
0006986309.tif 000007
【図６】
0006986309.tif 000008
【図７Ａ】
0006986309.tif 000009
【図７Ｂ】
0006986309.tif 000010
【図８】
0006986309.tif 000011
【図９Ａ】
0006986309.tif 000012
【図９Ｂ】
0006986309.tif 000013
【図１０】
0006986309.tif 000014
【図１１】
0006986309.tif 000015
【図１２】
0006986309.tif 000016
【図１３】
0006986309.tif 000017
【図１４】
0006986309.tif 000018
【図１５】
0006986309.tif 000019
【図１６Ａ】
0006986309.tif 000020
【図１６Ｂ】
0006986309.tif 000021
【図１７Ａ】
0006986309.tif 000022
【図１７Ｂ】
0006986309.tif 000023
【図１８】
0006986309.tif 000024
【図１９Ａ】
0006986309.tif 000025
【図１９Ｂ】
0006986309.tif 000026
【図２０】
0006986309.tif 000027
【図２１Ａ】
0006986309.tif 000028
【図２１Ｂ】
0006986309.tif 000029
【図２２】
0006986309.tif 000030
【図２３】
0006986309.tif 000031
【図２４Ａ】
0006986309.tif 000032
【図２４Ｂ】
0006986309.tif 000033
【図２５】
0006986309.tif 000034
【図２６】
0006986309.tif 000035
【図２７】
0006986309.tif 000036
【図２８】
0006986309.tif 000037
【図２９】
0006986309.tif 000038
【図３０】
0006986309.tif 000039
【図３１】
0006986309.tif 000040
【図３２】
0006986309.tif 000041