以下、図面を参照して本発明の実施の形態について説明する。ただし、本発明が以下の実施の形態に限定される訳ではない。また、説明を明確にするため、以下の記載および図面は、適宜、省略、および簡略化がなされている。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
(関連する技術の検討)
実施の形態の理解を助けるため、データベースのデータ処理について検討する。データベースの処理は大別すると、大量なデータの中から対象データを絞り込む検索処理と、その結果を分類する集約処理に分けられる。一般的なデータベースでは、前者を高速に行うためにインデックスを使用し、後者を高速に行うためにハッシュやSORTなどの処理を組み合わせている。
検索については、特許文献1及び2に記載されたようなDBP(超並列演算装置)を使うことで、インデックスを使わずに高速動作が可能になる。しかしながら、特許文献1及び2、非特許文献1及び2には、その検索結果に対する集約の操作については示されていない。
そこで、集約処理について検討する。集約の種類としては、集合の中から同値のものを集めるグルーピング(GROUP BY)処理、2つの集合を特定のキーによって結合する(JOIN)処理が代表的である。また、集合の中から同値のものを排除し、ユニークな集合を得る重複排除(DISTINCT)処理、集合をあるキーで昇順もしくは降順に並べ替えるソート(ORDER BY)処理も集約処理に含まれ得る。一般的なデータベースでは、この集約を行うための方法として、上記のようにSORTやハッシュが使われる。また、結合(JOIN)処理では、インデックスを使った検索処理の応用として一件ずつ順次結合先を探すネステッドループJOINも行われる。
ソート方式では、データに対して一旦、グルーピングキーでソートを行い、その結果に対し、同値の範囲をグルーピングしていく。ハッシュ方式の場合は、グルーピングキーに対し、まずハッシュ値を求めて、そのハッシュ値に従ったブロックにデータを分散させる。ただし、ハッシュ値は異なるキーに対して、同じハッシュ値が生成される(ハッシュ値の衝突)ことがあるため、同じハッシュブロックの中に異なるグルーピングキーのデータが入る場合は、それらを更に別々のブロックに分散させる。こうすることで、末端のブロックには同じグルーピングキーを持つデータを集めることができる。
関連する技術では、これらの処理について、コンピュータの持つ基本的な処理単位であるワードなどの単位でデータを一件ずつ処理していく。これに対し、以下に説明するように、本発明の実施の形態における集約処理(グルーピング処理)では、複数のデータに対して同時に処理を行い、集約データ(グルーピングデータ)を順次抽出していく。このように、実施の形態では、関連する技術とは異なった処理方式を取るため、その処理特性においても、関連する技術とは異なった特性を得ることが可能となる。例えば、関連する技術が得意な分野と本発明の実施の形態が得意な分野を処理の内容によって使い分けることで、双方の長所を生かして大幅な処理の効率化を図ることも可能となる。
(実施の形態1)
次に、実施の形態1について説明する。本実施の形態では、本発明の基本的な例として、ビットスキャンを含むスキャンダウンによる基本グルーピングソート処理について説明する。
<データ処理装置の構成>
図1は、本実施の形態に係るデータ処理装置の構成例を示している。本実施の形態に係るデータ処理装置100は、データ処理の一例として、入力データに対しグルーピングソート処理を行う。なお、本来データベースにおけるグルーピング処理では、グルーピングの結果は、あくまで同一のものを集約したデータを得ることで、その順序性については規定が無い。しかしながら、本件のグルーピング処理では、グルーピングとソートが同時に行われ、ソートの結果にグルーピングデータを含む形式になる。このため、以降の説明での本件のグルーピングを「グルーピングソート」と呼ぶ。図1に示すように、データ処理装置100は、記憶部110、取得部120、マスク保持部130、スキャンダウン部140、出力部150を備えている。なお、図1の構成は一例であり、本実施の形態に係るデータ処理が可能であれば、その他の構成としてもよい。また、データ処理装置100は、一つの装置でもよいし、複数の装置でもよい。
記憶部110は、入力される複数の入力データを記憶する。入力データは、データ処理装置100が処理する処理対象のデータである。例えば、記憶部110は、入力データのビット幅と入力データのレコード数に応じた所定のメモリセル構造のメモリである。例えば、記憶部110は、特許文献1及び2のようなDBPと同様のメモリセル構造のメモリであるか、その他の構造のメモリでもよいし、メモリに限らずその他の任意の記憶手段でもよい。図2は、記憶部110のメモリセル構造の一例を示している。例えば、入力データの1レコード(1ワード)がN(N>0の整数)ビットであり、M(M>0の整数)レコードの入力データが入力される場合、図2に示すように、記憶部110をM行×N列のメモリセル構造とし、各行に各入力データを格納する。
取得部120は、記憶部110が記憶する複数の入力データからスキャンダウン部140が処理するスキャンデータをビット列順(ビット位置順)に選択し取得する。スキャンデータは、複数の入力データにおける同じビット位置のビットデータを含むデータである。取得部120は、例えば図2に示すように、MレコードのNビットデータにおいて、各レコードの同じビット位置のビットデータをビット列単位に選択し、選択したM個のビットデータをレコード順(入力順)に抽出して、スキャンデータを取得する。すなわち、MレコードのNビットデータが入力される場合、MビットのスキャンデータがN個取得される。また、取得部120は、MレコードのNビットデータに対し、ビット列順に第1ビット列から第Nビット列へデータ検索方向(スキャンダウン方向)にスキャンデータを取得する。データ検索方向は、スキャンダウン部140によりスキャンダウン処理が行われる処理順に応じた方向であり、MSB(Most Significant Bit)からLSB(Least Significant Bit)へ向かう方向であるが、処理の内容によってはLSBからMSBへ向かう方向としてもよいし、処理の内容に応じた特別な順序でも良い。
マスク保持部130は、スキャンダウン部140がスキャンダウン処理で使用するマスタマスクを保持(記憶)する。マスタマスクは、複数の入力データからスキャンダウン処理の対象となるソート対象(レコード)を特定するデータである。また、マスタマスクは、スキャンダウン部140によって行われるスキャンダウン処理の結果により更新され、次の処理への有効データの引継ぎに使われる。例えば、マスタマスクは、対象データをONビット(有効ビット)のビット位置で示す。全データ(レコード)をソートする場合、マスタマスクは全ビットがONとなる。また、特定のレコードのみを処理対象としたい場合は、該当するレコード位置のビットのみONに設定することで、処理対象を自由に設定できる。
スキャンダウン部140は、取得部120が取得したスキャンデータに対しビットスキャン処理を含むスキャンダウン処理を行う。スキャンダウン部140は、各スキャンデータに対しビットスキャン処理を行うビットスキャン部でもあり、第1のビット位置のスキャンデータから第Nのビット位置のスキャンデータまでビットスキャン処理を繰り返すスキャンダウン処理を行う。これにより、入力データを昇順または降順にソートする。この際、ビットスキャン処理の特性により、対象データの中に複数の同じ値を持つレコードが存在する場合は、それら複数レコードの検出が同時に行われる。ソートをした上で、グルーピング処理も同時に行うため、この処理をグルーピングソート処理とも呼び、特に本実施の形態のソート処理を基本グルーピングソート処理と呼ぶ場合がある。ビットスキャン処理は、スキャンデータを用いてマスクデータに対してマスクをかけるマスク処理とマスク処理の結果に応じたマスクデータの更新処理とを含む。例えば、スキャンダウン部140は、マスク処理を行うマスク処理部とマスクデータを更新するマスクデータ更新処理部を含んでいてもよい。スキャンダウン部140は、入力データを昇順にソートする場合、マスクデータに対しスキャンデータの反転データを使ってマスク(ANDNot)をかけ、前記入力データを降順にソートする場合、マスクデータに対しスキャンデータをそのまま使ってマスク(AND:論理積)をかける。
また、スキャンダウン部140は、マスク保持部130に保持されたマスタマスクをマスク処理に用いるマスクデータの初期値として、N個のスキャンデータに対するスキャンダウン処理(一巡のビットスキャン処理)を開始する。これにより、マスタマスクに対応するソート対象のデータ(レコード)の最小値(昇順の場合)または最大値(降順の場合)のデータを得る。スキャンダウン処理は、第1のビット列(例えばMSB)のスキャンデータから第Nのビット列(例えばLSB)のスキャンデータまで繰り返されるビットスキャン処理を含み、全てのデータのソート(スキャン)が完了するまでこのスキャンダウン処理を繰り返す。
スキャンダウン部140は、N個のスキャンデータに対するスキャンダウン処理の終了ごとに、スキャンダウン処理の結果に応じてマスタマスクを更新する。例えば、マスタマスクの更新では、現在のマスタマスクとスキャンダウン処理の結果の反転データ(NOT)をAND演算した結果により、マスタマスクを更新する。こうして更新されたマスタマスクは次のスキャンダウン処理によるソート対象となる。すなわち、マスタマスクを更新することにより、スキャン処理結果として出力された(同値として検索された)データを除いて、次のスキャンダウン処理で処理するデータ(レコード)を絞り込む。全てのデータがスキャン処理結果として出力された場合、すなわち更新されたマスタマスクが0となった場合、全データに対するスキャンが完了したため、スキャンダウン処理を終了する。
出力部150は、スキャンダウン部140によるスキャンダウン処理の結果を所定のデータ処理結果として出力する。本実施の形態では、スキャンダウン処理により得られる昇順または降順の同値データのソート結果を、入力データをグルーピングソート処理した結果(グルーピングソートデータ)として出力する。すなわち、スキャンダウン処理では、同値のデータ(レコード)を同時に検索できるため、ソートの結果には、同時に検索された同値のデータ群が同じグループとしてグルーピングされて出力される。換言すると、出力部150は、スキャンダウン処理ごとに得られる同値の入力データをソート順に逐次出力する。つまり、出力部150は、N個のスキャンデータに対するスキャンダウン処理が終了する毎に1グループずつグルーピング結果を出力することが出来る。これは関連する技術によるグルーピング処理には無い特性になる。当然ながら、内部にデータを蓄積し、全データのソート(スキャン)が完了したときに全てのグルーピング結果をまとめて出力してもよい。なお、グルーピング処理に限らず、同値のデータを集約する処理を含む、任意の集約処理に適用してもよい。
<昇順の基本グルーピングソート処理の処理フロー>
図3は、本実施の形態に係るデータ処理方法のフローチャートの一例を示している。図3は、スキャンダウンによる基本グルーピングソート処理を昇順に行う場合の例である。例えば、以下の処理は主にスキャンダウン部140により実行され、結果の出力処理が出力部150により実行されるが、これに限られない。
図3に示すように、まず、データ処理装置100は、スキャンダウン処理の初期設定として、変数Aにマスタマスク(Mask)を設定し、変数PにMSB位置を設定する(S101)。例えば、マスタマスクの初期値は全ビットがONである。変数Aは、処理対象のスキャンデータにより、マスクを更新することで、データを絞り込んでいくマスクデータである。変数Pは、取得(処理)するスキャンデータのビット列を示し、N個のスキャンデータから処理対象のスキャンデータを特定する。
次に、データ処理装置100は、ビットスキャン処理に含まれるマスク処理として、この例では昇順にソートするため、Pビット列のスキャンデータのNOT(論理否定)演算結果とマスクデータである変数AとをAND(論理積)演算し、そのAND演算結果を変数Bに設定する(S102)。変数Bは、スキャンデータによってマスクデータに対してマスクをかけたマスク処理結果である。
次に、データ処理装置100は、マスク処理結果である変数Bが0か否か、すなわち、変数Bの全ビットがOFFか否か判定する(S103)。変数Bが0の場合は、Pビット列のスキャンデータによるマスク処理の結果、絞り込みの結果として残るデータが無いことを示す。このため、変数Bが0になる場合は、絞り込み失敗として、絞り込み結果を示すマスクデータである変数Aを更新しない。逆に、S103で変数Bが0以外の場合、すなわち、変数BのいずれかのビットがONの場合は、絞り込みが成功したことを示し、この場合は、絞り込み結果を示すマスクデータである変数Aを変数Bにより更新する(S104)。
次に、データ処理装置100は、処理中のビット列である変数PがLSBか否か、すなわち、全ビットのスキャン(スキャンダウン処理)が終了したか否かを判定する(S105)。
S105で変数PがLSB以外の場合、すなわち、全ビットのスキャンが終了していない場合、データ処理装置100は、次のスキャンのために、変数PをLSB側に一つ(1ビット)移動し(S106)、S102以降で次のビット列に対するビットスキャン処理を繰り返す。
また、S105で変数PがLSBである場合、すなわち、全ビットのスキャンが終了した場合、S104で更新されたマスクデータ(0以外のマスク処理結果)である変数Aを出力する(S107)。この処理結果のうち、ビットがONの位置が、マスタマスクで指定された対象データにおける最小値のレコード位置を示しており、本実施の形態では、これを同値データのグルーピング結果として出力する。
次に、データ処理装置100は、マスタマスクとマスクデータである変数Aの反転データ(NOT)をAND演算し、その結果によりマスタマスクを更新する(S108)。この処理により、マスタマスクの中のONビット(処理対象のレコード位置に対応)のうち、今回の出力によって既に処理が完了したデータに対するレコード位置のビットがOFFになる。なお、この処理にはマスタマスクとマスクデータである変数Aの排他的論理和(XOR)演算を使っても良い。次に、データ処理装置100は、更新したマスタマスクが0か否か、すなわち、全データ処理(ソート処理)が終了したか否かを判定する(S109)。S109でマスタマスクが0以外の場合、すなわち、まだ処理すべきデータが残っている場合は、S101以降でスキャンダウン処理を繰り返す。また、S109でマスタマスクが0の場合、すなわち、全データ処理が終了した場合、処理を終了する。
図4は、本実施の形態に係るデータ処理方法のフローチャートの他の例を示している。図4は、図3に示したスキャンダウンによる基本グルーピングソート処理において、さらに、処理結果を早期検出する例である。
図4の例では、S104でマスクデータである変数Aを変数Bにより更新した後、更新されたマスクデータ(0以外のマスク処理結果)である変数AのONビットが一つのみか否かを判定する(S110)。S110で変数AのONビットが一つのみではない場合は、更に絞り込みを行える可能性があるため、S105に進み全ビットのスキャンが終了したか否か判定する。一方、S110で変数AのONビットが一つのみの場合は、それ以上の絞り込みが不可能なため、S107に進み、マスクデータ(マスク処理結果)である変数Aを出力する。このように、マスク処理結果のONビットが1つとなった場合は、この時点で対象のレコードが1つに絞られ、処理結果が求まっている。このため、図4のように、1ビットだけがONとなるマスク処理結果を検出することで、最終ビット(LSB)までスキャンすることなく処理結果を求めることができ、処理ステップを削減できる。
<昇順の基本グルーピングソート処理の動作例>
図5A及び図5Bは、本実施の形態に係るデータ処理の動作例を示している。図5A及び図5Bは、図3に示したようにスキャンダウンによる基本グルーピングソート処理を昇順に行う場合の例である。
図5A及び図5Bの例では、レコード番号(RecNo)0~5の6レコードのデータが入力される。レコード番号0のデータ値が9、レコード番号1のデータ値が6、レコード番号2のデータ値が3、レコード番号3のデータ値が6、レコード番号4のデータ値が9、レコード番号5のデータ値が6である。各データは4ビットデータであり、各データのビット列(ビット位置)を[0]~[3](LSB~MSB)とする。また、スキャンデータ及びマスクデータはレコード数である6ビットとなる。
図5Aに示すように、4個のスキャンデータに対し1回目のスキャンダウン処理を行う。1回目のスキャンダウン処理では、マスタマスクの初期値は、“111111”であり(S201)、全データ(レコード番号0~5)がソート対象となる。
1回目のスキャンダウン処理では、まず、ビット列[3](MSB)のスキャンデータを使いビットスキャン処理を行う。具体的には、マスタマスク“111111”をマスクデータとして、ビット列[3]のスキャンデータ“100010”をNOT演算した結果の“011101”をマスクにかけることで、マスク結果は“011101”となる(S202)。
次に、ビット列[2]のスキャンデータを使いビットスキャン処理を行う。具体的には、ビット列[3]のマスク結果“011101”をマスクデータとして、ビット列[2]のスキャンデータ“010101”をNOT演算した結果“101010”をマスクにかけ、マスク結果は“001000”となる(S203)。
次に、ビット列[1]のスキャンデータを使いビットスキャン処理を行う。具体的には、ビット列[2]のマスク結果“001000”をマスクデータとしてビット列[1]のスキャンデータ“011101”をNOT演算した結果“100010”をマスクにかけ、マスク結果はオール0(“000000”)となる(S204)。このように、マスク結果がすべて0に成ってしまう場合は、前記フローチャートのS103の判定の通り、マスク結果の更新は行わず、直前の有効なマスクであるビット列[2]のマスク結果である“001000”を次の処理のマスクとして引き継ぐ。
次に、ビット列[0](LSB)のスキャンデータを使いビットスキャン処理を行う。この前の処理で、ビット位置[1]のマスク結果が0であったため、引き継いだビット列[2]のマスク結果“001000”をマスクデータとして、ビット列[0]のスキャンデータ“101010”をNOT演算した結果“010101”をマスクにかけ、マスク結果はオール0となる(S205)。ここでも同様に、マスク結果がすべて0に成ってしまうため、マスク結果の更新は行わず、直前の有効なマスクであるビット列[2]のマスク結果である“001000”を次の処理のマスクとして引き継ぐ。
次に、1回目のスキャンダウン処理が終了したため、処理結果を出力する。具体的には、直前で引き継いだマスク結果である“001000”を1回目のスキャンダウン処理の結果として出力する(S206)。すなわち、“001000”のONビットに対応するレコード番号2のデータが最小値のデータ(第1のグルーピング結果)となる。
次に、1回目のスキャンダウン処理結果によりマスタマスクを更新する。具体的には、現在のマスタマスク“111111”に対し、1回目のスキャンダウン処理結果をNOT演算した値である“110111”でマスクをかけ、そのマスク結果“110111”を次の2回目のスキャンダウン用の新しいマスタマスクとする(S207)。なお、この演算は、図3のフローチャートのS108で示すように、現在のマスタマスク“111111”と1回目のスキャンダウン処理結果“001000”をXOR演算した結果でも同じである。
次に、2回目のスキャンダウン処理を行う。2回目のスキャンダウン処理では、新しいマスタマスク“110111”を用いて(S211)、レコード番号0、1、3、4、5のデータをソート対象として、4個のスキャンデータを使ってビットスキャン処理を行う。1回目のスキャンダウン処理と同様に、ビット列[3]のスキャンデータを使いビットスキャン処理を行うと、マスク結果は“010101”となり(S212)、ビット列[2]のスキャンデータを使いビットスキャン処理を行うと、マスク結果はオール0となり(S213)、ビット列[1]のスキャンデータを使いビットスキャン処理を行うと、マスク結果はオール0となり(S214)、ビット列[0]のスキャンデータを使いビットスキャン処理を行うと、マスク結果は“010101”となる(S215)。細かな説明は省略しているが、1回目同様、ビットスキャンの結果がすべて0に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行う。
この結果2回目のスキャンダウン処理の結果は、ビット列[0]のマスク結果“010101”となる(S216)。すなわち、“010101”のONビットのレコード番号1、3、5に対応するデータが2番目に小さいデータ(第2のグルーピング結果)として出力される。また、現在のマスタマスク“110111”と2回目のスキャンダウン処理結果をNOT演算した結果“101010”とをマスクし、次の3回目のスキャンダウン用の新しいマスタマスクを“100010”とする(S217)。
次に、3回目のスキャンダウン処理を行う。3回目のスキャンダウン処理では、新しいマスタマスク“100010”を用いて(S221)、レコード番号0、4のデータをソート対象として、4個のスキャンデータを使ってビットスキャン処理を行う。1回目のスキャンダウン処理と同様に、ビット列[3]のスキャンデータを使いビットスキャン処理を行うと、マスク結果はオール0となり(S222)、ビット列[2]のスキャンデータを使いビットスキャン処理を行うと、マスク結果は“100010”となり(S223)、ビット列[1]のスキャンデータを使いビットスキャン処理を行うと、マスク結果は“100010”となり(S224)、ビット列[0]のスキャンデータを使いビットスキャン処理を行うと、マスク結果はオール0となる(S225)。2回目同様、ビットスキャンの結果がすべて0に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行う。
3回目のスキャンダウン処理の結果は、ビット列[0]のマスク結果が0であるため、ビット列[1]のマスク結果“100010”を引き継いだものとなる(S226)。すなわち、“100010”のONビットのレコード番号0、4に対応するデータが3番目に小さいデータ(第3のグルーピング結果)として出力される。また、現在のマスタマスク“100010”と3回目のスキャンダウン処理の結果をNOT演算した結果“011101”をマスクすると結果が“000000”となり、全ビットがOFFのため、処理を終了する(S227)。
図5A及び図5Bに示すように、各スキャンダウン処理の結果において、同値のレコード(データ)については同時に該当するビットがONとなるため、スキャンダウン処理の結果を同値のグルーピング結果として出力する。図5A及び図5Bの例では、昇順のグルーピングソート処理の結果は、個数=3、レコード番号=(2),(1,3,5),(0,4)となる。
なお、グルーピング結果(ビットスキャン処理の結果)のONビットの個数を数えることで、グループに属するレコードのカウント値を取得(出力)してもよい。また、グルーピング結果を使い、それらの該当するレコードの特定の要素(データ値)を加算することで合計を求めてもよいし、その合計をグループに属するレコード件数で割ることで平均を求めてもよい。さらに、グルーピングの結果から、各々一つのみのデータを抽出することで、重複排除の結果(ユニーク値の集合)を取得してもよい。
<降順の基本グルーピングソート処理の処理フロー>
図6は、本実施の形態に係るデータ処理方法のフローチャートの別の例を示している。図6は、スキャンダウンによる基本グルーピングソート処理を降順に行う場合の例である。図6の例では、図3の昇順のフローチャートに対し、S102aの処理のみが異なる。すなわち、S102aにおいて、マスク処理として、降順にソートするため、マスクデータである変数AとPビット列のスキャンデータをそのままAND演算し、そのAND演算結果を変数Bに設定する。
<降順の基本グルーピングソート処理の動作例>
図7A及び図7Bは、本実施の形態に係るデータ処理の他の動作例を示している。図7A及び図7Bは、図6に示したようにスキャンダウンによる基本グルーピングソート処理を降順に行う場合の例である。図7A及び図7Bの例では、図5A及び図5Bと同じデータが入力される。
図7Aに示すように、図5Aと同様、マスタマスク“111111により、1回目のスキャンダウンを行う(S301)。ビット列[3]のビットスキャン処理では、マスタマスク“111111”をマスクデータとして、ビット列[3]のスキャンデータ“100010”をマスクにかけ、マスク結果が“100010”となる(S302)。ビット列[2]のビットスキャン処理では、ビット列[3]のマスク結果“100010”をマスクデータとして、ビット列[2]のスキャンデータ“010101”をマスクにかけ、マスク結果がオール0(“000000”)となる(S303)。マスク結果がすべて0に成ってしまうため、前記図5Aの昇順処理で示したS204同様、マスク結果の更新は行わず、直前の有効なマスクであるビット列[3]のマスク結果である“ 100010”を次の処理のマスクとして引き継ぐ。
ビット列[1]のビットスキャン処理では、引き継いだマスク結果“100010”をマスクデータとして、ビット位置[1]のスキャンデータ“011101”をマスクにかけ、マスク結果がオール0となる(S304)。ここでもマスク結果がすべて0になるため、ビット列[3]のマスク結果“100010”をマスクデータとして引き継ぎ、ビット列[0]のスキャンデータ“101010”をマスクにかけ、マスク結果が“100010”となる(S305)。
1回目のスキャンダウン処理の結果は、ビット列[0]のマスク結果“100010”となる(S306)。すなわち、“100010”のONビットのレコード番号0、4に対応するデータが最大値のデータ(第1のグルーピング結果)として出力される。また、現在のマスタマスク“111111”と1回目のスキャンダウン処理結果をNOT演算した結果“011101”とをマスクすることにより、次の2回目のスキャンダウン用の新しいマスタマスクを“011101”とする(S307)。
次に、2回目のスキャンダウン処理を行う。2回目のスキャンダウン処理では、新しいマスタマスク“011101”を用いて(S311)、レコード番号1、2、3、5のデータをソート対象として、1回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列[3]のスキャンデータのマスク結果はオール0となり(S312)、ビット列[2]のスキャンデータのマスク結果は“010101”となり(S313)、ビット列[1]のスキャンデータのマスク結果は“010101”となり(S314)、ビット列[0]のスキャンデータのマスク結果はオール0となる(S315)。なお、前記同様、ビットスキャンの結果がすべて0に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行う。
2回目のスキャンダウン処理の結果は、ビット列[0]のマスク結果が0であるため、ビット列[1]のマスク結果“010101”となる(S316)。すなわち、“010101”のONビットのレコード番号1、3、5が2番目に大きいデータ(第2のグルーピング結果)として出力される。また、現在のマスタマスク“011101”と2回目のスキャンダウン処理結果をNOT演算した結果“101010”をマスクすることにより、次の3回目のスキャンダウン用の新しいマスタマスクを“001000”とする(S317)。
次に、3回目のスキャンダウン処理を行う。3回目のスキャンダウン処理では、新しいマスタマスク“001000”を用いて(S321)、レコード番号2のデータをソート対象として、1回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列[3]のスキャンデータのマスク結果はオール0となり(S322)、ビット列[2]のスキャンデータのマスク結果はオール0となり(S323)、ビット列[1]のスキャンデータのマスク結果は“001000”となり(S324)、ビット列[0]のスキャンデータのマスク結果は“001000”となる(S325)。ここでも、前記同様、、ビットスキャンの結果がすべて0に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行う。
3回目のスキャンダウン処理の結果は、ビット列[0]のマスク結果“001000”となる(S326)。すなわち、“001000”のONビットのレコード番号2に対応するデータが3番目に大きいデータ(第3のグルーピング結果)として出力される。また、現在のマスタマスク“001000”と3回目のスキャンダウン処理結果をNOT演算した結果“110111”とのマスク結果が“000000”となり、全ビットがOFFのため、処理を終了する(S327)。図7A及び図7Bの例では、降順のグルーピングソート処理の結果は、個数=3、レコード番号=(0,4),(1,3,5),(2)となる。
<本実施の形態の効果>
以上のように、本実施の形態における基本グルーピングソート処理では、ビットスキャン方向に対して直交する形で格納したデータのビットに対し、単純にMSBを開始位置として、LSB方向に対してデータをスキャンダウンしていくことにより、最終的なグルーピングデータを抽出することができる。また、この動作に、未処理データを示すマスタマスクを組み合わせ、スキャンダウンの結果をマスタマスクから減算し、マスタマスクの有効ビットが無くなるまで、ループ処理を繰り返すことにより、全グルーピングデータを順次抽出することができる。このような処理により、効率よく高速にグルーピング処理を行うことが可能となる。
特に、本実施の形態のグルーピング処理では、上記のように、処理対象のデータをONビットの位置で示すマスタマスクを使用し、そのマスタマスクにより初期化されたマスクデータに対し、データの各ビット位置をMSBからLSBに向かって、降順ソートの場合はAND演算を行い、昇順ソートの場合はANDNot演算を行う。そして、この演算の途中で、マスクデータが0になる場合は、単純にその回の演算結果は捨てて、演算前のマスクデータを引き継ぐだけでよい。これにより、特許文献1及び2、非特許文献1及び2のような関連する技術と比べて、大幅に処理ステップ数を減らすことができる。そもそも、関連する技術には、グルーピング処理に関する記載もないため、本実施の形態のようにグルーピング処理に適用することはできない。
また、特許文献1及び2のような関連する技術では、各ビット位置が2のn乗に相当する値を持つことを前提としている。このため、BCD(2進化10進)コードを使用するような形態では処理が行えるが、BCDコードに変換できない浮動小数点のようなデータに対しては、同じ形で処理を行うことができない。例えば、浮動小数点数値(IEEE754形式)は、符号ビット、指数部、仮数部から構成されているため、関連する技術のロジックで使われている、特定のビットが2のn乗に相当するという理論は成立しない。しかしながら、浮動小数点数値では、符号ビットを除いた他のビットの配置は、より上位のビットが立っている数値は、ビットが立っていない数値に対して大きい値になるように設計されている。従って、スキャンダウンを使った本実施の形態の方式では論理に矛盾が生じることはなく、浮動小数点の最大、最小についても検出が可能になる。同様に、辞書式の文字列に対しても適用が可能になる。
さらに、本実施の形態でメモリに格納されるデータの横方向(1ワード)のビットサイズは、例えばIntel(登録商標)の最近のCPU(Central Processing Unit)を利用する場合であれば、一般のInt系のデータの8ビット、16ビット、32ビット、64ビットとすることができる。また、AVXと呼ぶSIMD(Single Instruction/Multiple Data)命令で利用できる256ビットや512ビットとすることもでき、Arm(登録商標)であればNeonと呼ぶSIMDで利用できる128ビットとすることも可能である。また、特許文献1及び2のDBPを利用する場合は、さらに大きなビット幅を使って処理することができる。加えて、最近利用が広まっているGPGPU(General-purpose computing on graphics processing units)についても、数千のコアに対しビット演算系の命令を使って処理を行うことで、GPGPUの並列処理の特性を生かした処理を行うことが可能である。一方、Java(登録商標)のような中間コードを経由して実行するような言語の場合は、SIMDを有効に使うVectorAPIなどの手段を使うことで、実施が可能になる。さらに、既存のハードウェア上でソフトウェアによる演算ロジックとして動作が可能なことから、その内容をFPGA(Field Programmable Gate Array)に組み込んで、ハードウェア的な回路として実施することも可能である。従って、本実施の形態は、モバイルを含む組み込み系から、大規模なクラスターを構成するクラウドシステムまで、ほぼ全てのコンピュータシステムに適用可能である。特にクラスター構成では、グルーピング結果がソート済みの状態で逐次出力されるため、上位の集約ノードでは、下位ノードのグルーピング結果を、単純なマージ処理によってまとめるだけで、全体のグルーピング結果についても、逐次出力を行うことが出来る。
(実施の形態2)
次に、実施の形態2について説明する。本実施の形態では、実施の形態1のデータ処理装置において、さらにデータ処理を中断及び再開する例について説明する。
<データ処理装置の構成>
図8は、本実施の形態に係るデータ処理装置の構成例を示している。図8に示すように、本実施の形態に係るデータ処理装置100は、実施の形態1の構成に加えて、マスク退避部131を備えている。マスク退避部131は、スキャンダウン処理の中断時、マスク保持部130のマスタマスクを退避する。例えば、スキャンダウン処理結果により任意の数(指定件数)のデータが得られたときに、マスタマスクを退避して、処理を中断し、結果を出力してもよい。また、スキャンダウン処理の再開時、マスク退避部131に退避されたマスタマスクをマスク保持部130に回復し、回復したマスタマスクを用いて、スキャンダウン処理を行う。
<昇順のソート処理の動作例>
図9A及び図9Bは、本実施の形態に係るデータ処理の動作例を示している。図9A及び図9Bは、実施の形態1と同様にスキャンダウンによる基本グルーピングソート処理を昇順に行う際に、処理を中断し、その後、処理を再開する場合の例である。なお、ここではデータが単純にソートされる例を示すが、これに限らず、実施の形態1と同様にグルーピングソートすることが可能である。なお、以降の説明では、前記で示してきた、ビットスキャンの結果がすべて0に成る場合は、マスクの更新は行わず、直前の有効なマスクを引き継いだ上で、次のビットスキャン処理を行うという処理は、処理中に含まれているものとして説明する。
図9A及び図9Bの例では、レコード番号0~3の4レコードのデータが入力される。レコード番号0のデータ値が0、レコード番号1のデータ値が5、レコード番号2のデータ値が10、レコード番号3のデータ値が3である。各データはビット列[0]~[3]の4ビットデータであり、スキャンデータ及びマスクデータも4ビットである。
図9Aに示すように、実施の形態1と同様、マスタマスク“1111”により、1回目のスキャンダウンを行う(S401)。ビット列[3]のスキャンデータのマスク結果は“1101”となり(S402)、ビット列[2]のスキャンデータのマスク結果は“1001”となり(S403)、ビット列[1]のスキャンデータのマスク結果は“1000”となり(S404)、ビット列[0]のスキャンデータのマスク結果は“1000”となる(S405)。
1回目のスキャンダウン処理の結果は、ビット列[0]のマスク結果“1000”となる(S406)。すなわち、“1000”のONビットのレコード番号0が最小値のデータとして出力される。また、現在のマスタマスク“1111”と1回目のスキャンダウン処理結果をNOT演算した結果“0111”を使いマスクすることにより、次の2回目のスキャンダウン用の新しいマスタマスクを“0111”とする(S407)。
次に、2回目のスキャンダウン処理では、新しいマスタマスク“0111”を用いて(S411)、レコード番号1、2、3のデータをソート対象として、1回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列[3]のスキャンデータのマスク結果は“0101”となり(S412)、ビット列[2]のスキャンデータのマスク結果は“0001”となり(S413)、ビット列[1]のスキャンデータのマスク結果はオール0(“0000”)となり(S414)、ビット列[0]のスキャンデータのマスク結果はオール0となる(S415)。
2回目のスキャンダウン処理の結果は、ビット列[0]及び[1]のマスク結果が0であるため、ビット列[2]のマスク結果“0001”となる(S416)。すなわち、“0001”のオンビットのレコード番号3が2番目に小さいデータとして出力される。また、現在のマスタマスク“0111”と2回目のスキャンダウン処理結果をNOT演算した結果“1110”とのマスクにより、次の3回目のスキャンダウン用の新しいマスタマスクを“0110”とする(S417)。スキャンダウン処理を中断する場合、この時点のマスタマスク“0110”をマスク退避部131に退避する(S418)。この例は、2個のデータが得られた場合に処理を中断する例であり、中断時のソート処理の結果は、個数=2、レコード番号=(0),(3)となる。
その後、スキャンダウン処理を再開する場合、マスク退避部131からマスタマスク“0110”を回復する(S420)。次に、3回目のスキャンダウン処理では、回復したマスタマスク“0110”を用いて(S421)、レコード番号1、2のデータをソート対象として、1回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列[3]のスキャンデータのマスク結果は“0100”となり(S422)、ビット列[2]のスキャンデータのマスク結果はオール0となり(S423)、ビット列[1]のスキャンデータのマスク結果は“0100”となり(S424)、ビット列[0]のスキャンデータのマスク結果はオール0となる(S425)。
3回目のスキャンダウン処理の結果は、ビット列[0]のマスク結果が0であるため、ビット位置[1]のマスク結果“0100”となる(S426)。すなわち、“0100”のONビットのレコード番号1が3番目に小さいデータとして出力される。また、現在のマスタマスク“0110”と3回目のスキャンダウン処理結果をNOT演算した結果“1011”とのマスクにより、次の4回目のスキャンダウン用の新しいマスタマスクを“0010”とする(S427)。
次に、4回目のスキャンダウン処理を行う。4回目のスキャンダウン処理では、新しいマスタマスク“0010”を用いて(S431)、レコード番号2のデータをソート対象として、1回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列[3]のスキャンデータのマスク結果はオール0となり(S432)、ビット列[2]のスキャンデータのマスク結果は“0010”となり(S433)、ビット列[1]のスキャンデータのマスク結果はオール0となり(S434)、ビット列[0]のスキャンデータのマスク結果は“0010”となる(S435)。
4回目のスキャンダウン処理の結果は、ビット列[0]のマスク結果“0010”となる(S436)。すなわち、“0010”のONビットのレコード番号2が4番目に小さいデータとして出力される。また、現在のマスタマスク“0010”と4回目のスキャンダウン処理結果をNOT演算した結果“1101”とのマスク結果が“0000”となり、全ビットがOFFのため、処理を終了する(S437)。再開後のソート処理の結果は、個数=2、レコード番号=(1),(2)となる。
<本実施の形態の効果>
以上のように、本実施の形態では、スキャンダウンによるグルーピングソート処理において、グルーピングにより任意の数のデータを取得した時点で、一旦マスタマスクを退避しておくことで、グルーピングソート処理を中断し、それまでのグルーピングソート結果を出力することができる。これにより、特定のグルーピングキーにランキング評価値が格納されているような場合、この値の上位、もしくは下位から指定件数だけを、効率よく取得することが可能になる。
さらに、退避しておいたマスタマスクを回復し、スキャンダウン処理を再開することで、中断前の状態からの継続(インクリメンタル)としてのグルーピングソート結果を取得し、中断位置から処理を再開することができる。グルーピングソート結果は必ず昇順または降順で先頭から順番に出力されるため、先頭から10件や100件などの件数のデータのみを取得することも可能で、その場合の処理コストは取得する件数に比例する。なお、マスタマスクは処理対象を絞り込む機能を持つため、何らかの事前絞り込み処理の結果によりマスタマスクを設定(対象レコードのビットのみON)してもよい。
(実施の形態3)
次に、実施の形態3について説明する。本実施の形態では、実施の形態1、2のデータ処理装置において、ビットスキャン処理の開始前に処理対象のデータを絞り込むことでポジショナルグルーピング処理を行う例について説明する。
<データ処理装置の構成>
図10は、本実施の形態に係るデータ処理装置の構成例を示している。図10に示すように、本実施の形態に係るデータ処理装置100は、実施の形態1の構成に加えて、絞り込み部132を備えている。
絞り込み部132は、グルーピングソート処理を行う前に、グルーピングソート処理の対象となるデータを所定の範囲に絞り込む。絞り込み部132は、入力データからソート対象のデータを絞り込み、絞り込み結果に応じてマスク保持部130のマスタマスクを更新する。絞り込み部132は、N個のスキャンデータに対しビット列順にビットスキャン処理(すなわち、スキャンダウン処理)を行うことで、入力データから所定の範囲のデータを抽出する。例えば、昇順にソートする場合、絞り込みの基準値を示す絞り込み開始データよりも大きい(または基準値以上の)データを抽出し、降順にソートする場合、絞り込み開始データよりも小さい(または基準値以下の)データを抽出する。これにより、絞り込み開始データの位置からグルーピングソートを開始するポジショナルグルーピング処理を行うことができる。
<昇順のポジショナルグルーピングソート処理の処理フロー>
図11は、本実施の形態に係るデータ処理方法のフローチャートを示している。図11は、昇順のポジショナルグルーピング処理の例であり、絞り込み開始データよりも大きいデータに絞り込み(大なり検索し)、絞り込んだデータをグルーピングソートする例である。例えば、以下の処理は主に絞り込み部132により実行されるが、これに限られない。
図11に示すように、まず、データ処理装置100は、絞り込み処理の初期設定として、スタートマスク(Start_mask)を0に初期化し、変数PにMSB位置を設定する(S501)。スタートマスクは、絞り込み結果により、グルーピングソート処理の開始位置を設定するためのマスクデータである。変数Pは、実施の形態1と同様に、取得するスキャンデータのビット列を示す。
次に、データ処理装置100は、絞り込み開始データのPビット列のビットが0(OFF)か否か判定する(S502)。絞り込み開始データは、データを所定範囲に絞り込む基準値であり、昇順ソートの場合、抽出(検索)するデータの最小値を示し、降順ソートの場合、抽出するデータの最大値を示す。
S502で絞り込み開始データのPビット列のビットが0の場合、データ処理装置100は、テンポラリ変数(Tmp)にマスタマスク(Mask)を設定し、Pビット列のスキャンデータのNOT演算結果とマスタマスクとをAND演算した結果によりマスタマスクを更新し、続けてテンポラリ変数とマスタマスクとをXOR演算し、さらにそのXOR演算結果とスタートマスクとをOR(論理和)演算した結果によりスタートマスクを更新する(S503)。また、S502で絞り込み開始データのPビット列のビットが0以外の場合、データ処理装置100は、Pビット列のスキャンデータとマスタマスクとをAND演算した結果によりマスタマスクを更新する(S504)。
S503またはS504の後、データ処理装置100は、処理中のビット列である変数PがLSBか否か、すなわち、全ビットのスキャンが終了したか否か判定する(S505)。S505で変数PがLSB以外の場合、すなわち、全ビットのスキャンが終了していない場合、データ処理装置100は、次のスキャンのために、変数PをLSB側に一つ移動し(S506)、S502以降で次のビット列に対するビットスキャン処理(絞り込み処理)を繰り返す。また、S505で変数PがLSBである場合、すなわち、全ビットのスキャンが終了した場合、データ処理装置100は、絞り込み開始データよりも大きいデータの検索結果(大なり検索結果)としてスタートマスクをマスタマスクに設定する(S507)。なお、絞り込み開始データ以上の検索結果(大なりイコール検索結果)とする場合、求めたスタートマスクと現在のマスタマスクをOR演算した結果をマスタマスクに設定する。その後、実施の形態1で示した昇順のグルーピングソート処理を行う(S508)。
<大なり検索処理の動作例>
図12は、本実施の形態に係るデータ処理の動作例を示している。図12は、昇順のポジショナルグルーピングソート処理のための絞り込み処理の例であり、比較値よりも大きいデータを検索する大なり検索の例である。
図12の例では、大なり検索のための比較値(絞り込み開始データ)は5であり、レコード番号0~3の4レコードのデータが入力される。レコード番号0のデータ値が3、レコード番号1のデータ値が7、レコード番号2のデータ値が5、レコード番号3のデータ値が15である。各データはビット列[0]~[3]の4ビットのデータあり、スキャンデータ及びマスクデータは4ビットである。
図12に示すように、マスタマスク(ExistMask)の初期値は“1111”であり(S601)、スタートマスク(GreaterMask)の初期値は“0000”である(S602)。
まず、比較値のビット列[3]が0であるため、ビット列[3]のスキャンデータに対しビットスキャン処理及びスタートマスク更新処理を行う。具体的には、マスタマスク“1111”をマスクデータとして、ビット列[3]のスキャンデータ“0001”をNOT演算した結果“1110”をマスクにかけ、マスク結果が“1110”となる(S603)。さらに、マスクデータ“1111”とマスク結果“1110”をXOR演算し、XOR結果“0001”とスタートマスク“0000”をOR演算し、その結果によりスタートマスクを“0001”とする(S604)。
次に、比較値のビット列[2]が1であるため、ビット列[2]のスキャンデータに対しビットスキャン処理を行う。具体的には、ビット列[3]のマスク結果“1110”をマスクデータとして、ビット列[2]のスキャンデータ“0111”をマスクにかけ、マスク結果が“0110”となる(S605)。
次に、比較値のビット列[1]が0であるため、ビット列[1]のスキャンデータに対しビットスキャン処理及びスタートマスク更新処理を行う。具体的には、ビット列[2]のマスク結果“0110”をマスクデータとして、ビット列[1]のスキャンデータ“1101”をNOT演算した結果“0010”をマスクにかけ、マスク結果が“0010”となる(S606)。さらに、マスクデータ“0110”とマスク結果“0010”をXOR演算し、XOR結果“0100”とスタートマスク“0001”をOR演算し、その結果によりスタートマスクを“0101”とする(S607)。
次に、比較値のビット列[0]が1であるため、ビット列[0]のスキャンデータに対しビットスキャン処理を行う。具体的には、ビット列[1]のマスク結果“0010”をマスクデータとして、ビット列[0]のスキャンデータ“1111”にマスクをかけ、マスク結果が“0010”となる(S608)。
これにより、ビット列[0]のマスク結果“0010”が同値検索の結果となる(S609)。すなわち、“0010”のONビットのレコード番号2が比較値5と同値のデータとなる。また、ビット列[1]で更新されたスタートマスク“0101”が大なり検索の結果となる(S610)。すなわち、“0101”のONビットのレコード番号1、3が比較値5よりも大きいデータとなる。さらに、大なりイコールの検索結果とする場合は、同値の結果“0010”とスタートマスク“0101”をOR演算することにより、“0111”が得られ、これが大なりイコールの検索結果となる。
このように、スタートマスク(GreaterMask)を用意し、このスタートマスクに、比較値のビットがOFFのビット列について、検索先のデータビットがONの箇所を論理和(OR)していくことにより、比較値よりも大きいデータを検索する大なり検索の結果が得られる。本実施の形態では、この検索処理により得られるスタートマスクをグルーピングソート(昇順)開始時のマスクデータとする。また、大なりイコール(比較値以上)のデータを検索する場合は、大なり検索結果と同値結果を論理和演算した結果をマスクデータとする。なお、図12において、ビットスキャン処理でマスク結果が0となった場合、未処理データが無いと判断して、検索処理を早期終了してもよい。
<降順のポジショナルグルーピングソート処理の処理フロー>
図13は、本実施の形態に係るデータ処理方法のフローチャートの他の例を示している。図13は、降順のポジショナルグルーピング処理の例であり、絞り込み開始データよりも小さいデータに絞り込み(小なり検索)し、絞り込んだデータをグルーピングソートする例である。図13では、図11の昇順のフローチャートに対し、S502a、S503a、S504a、S508aが異なる。
すなわち、降順の場合、S501の後、データ処理装置100は、絞り込み開始データのPビット列のビットが1(ON)か否か判定する(S502a)。S502aで絞り込み開始データのPビット列のビットが1の場合、データ処理装置100は、テンポラリ変数(Tmp)にマスタマスク(Mask)を設定し、続けてPビット列のスキャンデータとマスタマスクとをAND演算した結果によりマスタマスクを更新し、さらにテンポラリ変数とマスタマスクとをXOR演算し、そのXOR演算結果とスタートマスクとをOR演算した結果によりスタートマスクを更新する(S503a)。また、絞り込み開始データのPビット列のビットが1以外の場合、データ処理装置100は、Pビット列のスキャンデータのNOT演算結果とマスタマスクとをAND演算した結果によりマスタマスクを更新する(S504a)。さらに、S507のマスタマスクの更新後、実施の形態1で示した降順のグルーピングソート処理を行う(S508a)。
<小なり検索処理の動作例>
図14は、本実施の形態に係るデータ処理の他の動作例を示している。図14は、降順のポジショナルグルーピングソート処理のための絞り込み処理の例であり、比較値よりも小さいデータを検索する小なり検索の例である。図14の例では、小なり検索のための比較値(絞り込み開始データ)及び入力されるデータは図12と同じである。
図14に示すように、マスタマスク(ExistMask)の初期値は“1111”であり(S701)、スタートマスク(LessMask)の初期値は“0000”である(S702)。
まず、比較値のビット列[0]が0であるため、ビット列[3]のスキャンデータに対しビットスキャン処理を行う。具体的には、マスタマスク“1111”をマスクデータとして、ビット列[3]のスキャンデータ“0001”をNOT演算した結果“1110”をマスクにかけ、マスク結果が“1110”となる(S703)。
次に、比較値のビット列[2]が1であるため、ビット列[2]のスキャンデータに対しビットスキャン処理及びスタートマスク更新処理を行う。具体的には、ビット列[3]のマスク結果“1110”をマスクデータとして、ビット列[2]のスキャンデータ“0111”をマスクにかけ、マスク結果が“0110”となる(S704)。さらに、マスクデータ“1110”とマスク結果“0110”をXOR演算し、XOR結果“1000”とスタートマスク“0000”をOR演算し、その結果によりスタートマスクを“1000”とする(S705)。
次に、比較値のビット列[1]が0であるため、ビット列[1]のスキャンデータに対しビットスキャン処理を行う。具体的には、ビット列[2]のマスク結果“0110”をマスクデータとして、ビット列[1]のスキャンデータ“1101”をNOT演算した結果“0010”をマスクにかけ、マスク結果が“0010”となる(S706)。
次に、比較値のビット列[0]が1であるため、ビット列[0]のスキャンデータに対しビットスキャン処理及びスタートマスク更新処理を行う。具体的には、ビット列[1]のマスク結果“0010”をマスクデータとして、ビット列[0]のスキャンデータ“1111”をマスクにかけ、マスク結果が“0010”となる(S707)。さらに、マスクデータ“0010”とマスク結果“0010”をXOR演算し、XOR結果“0000”とスタートマスク“1000”をOR演算し、その結果によりスタートマスクを“1000”とする(S708)。
これにより、ビット列[0]のマスク結果“0010”が同値検索の結果となる(S709)。すなわち、“0010”のONビットのレコード番号2が比較値5と同値のデータとなる。また、ビット列[0]で更新されたスタートマスク“1000”が小なり検索の結果となる(S710)。すなわち、“1000”のONビットのレコード番号0が比較値5よりも小さいデータとなる。小なりイコール検索の場合は、同値の結果“0010”とスタートマスク“1000”をORすることにより、“1010”が得られ、これが小なりイコールの検索結果となる。
このように、スタートマスク(LessMask)を用意し、このスタートマスクに、比較値のビットがONのビット列について、検索先のデータビットがOFFの箇所を論理和(OR)していくことにより、比較値よりも小さいデータを検索する小なり検索の結果が得られる。本実施の形態では、この検索処理により得られるスタートマスクをグルーピングソート(降順)開始時のマスクデータとする。また、小なりイコール(比較値以下)データを検索する場合は、小なり検索結果と同値結果を論理和演算した結果をマスクデータとする。なお、図14において、ビットスキャン処理でマスク結果が0となった場合、未処理データが無いと判断して、検索処理を早期終了してもよい。
<本実施の形態の効果>
以上のように、本実施の形態では、スキャンダウン処理によるグルーピングソート処理において、処理の開始時に、絞り込み開始データを使用して絞り込み処理を行い、その処理結果と連動してグルーピングソート処理を行うことで、絞り込み開始データで指定した任意の位置からグルーピングした結果を得ることができる。例えば、実施の形態2のような取得件数指定と本実施の形態を組み合わせることで、任意の値を開始値とした、任意の件数のグルーピングソートの結果を、取得することが出来る。また、これを応用し、直前のグルーピング結果の最終値を、次のポジショナルグルーピングの開始位置に指定することで、関連する技術を使ったグルーピング処理方式では難しかった、グルーピング結果の部分取得とスクロール動作が可能になる。さらに、ポジショナルグルーピングの開始位置を任意の値に設定することで、ジャンプスクロールの動作にも応用できる。加えて、絞り込み処理をする前のマスタマスクと、絞り込み結果のスタートマスクをXORすることで、絞り込みによって外れるデータのマスクを得ることも出来るため、この部分の件数の取得や、該当するレコードの特定の要素(データ値)を加算して合計を求めることも出来る。
なお、昇順、降順いずれのポジショナルグルーピング処理においても、後続のグルーピングソート処理を省略することで、大なり、もしくは小なりのデータ検索処理とすることが出来る。同様に、大なりイコール、小なりイコールの検索結果とする場合は、これに加えて、同値のマスクを単純にORすれば良い。
(実施の形態3の変形例)
実施の形態3の変形例として、絞り込み部132において、絞り込みと同時に、最初のグルーピングソート結果を出力してもよい。
<昇順のポジショナルグルーピングソート処理の処理フロー>
図15は、本変形例のフローチャートであり、図11に示した、昇順のポジショナルグルーピング処理の変形例を示している。
図15に示すように、まず、データ処理装置100は、スタートマスク(Start_mask)と変数Pの初期設定に加えて、ファーストマスク(First_mask)を0に初期化するする(S511)。ファーストマスクは、最も絞り込み開始データに近い最初の抽出データ(グルーピング結果)を示す。
次に、データ処理装置100は、絞り込み開始データのPビット列のビットが0か否か判定し(S512)、絞り込み開始データのPビット列のビットが0の場合、テンポラリ変数(Tmp)にマスタマスク(Mask)を設定し、Pビット列のスキャンデータのNOT演算結果とマスタマスクとをAND演算した結果によりマスタマスクを更新し、続けて、テンポラリ変数とマスタマスクとをXOR演算した結果で、テンポラリ変数を更新する(S513)。
次に、データ処理装置100は、テンポラリ変数が0か否かを判定する(S514)。S514でテンポラリ変数が0以外の場合、すなわち、ビットスキャンにより新たに絞り込み開始データより大きく、より絞り込み開始データに近いデータが抽出された場合、データ処理装置100は、テンポラリ変数の内容をファーストマスク(最初のグルーピング結果)に設定し、さらにテンポラリ変数とスタートマスクをOR(論理和)演算した結果によりスタートマスクを更新する(S515)。
また、S512で絞り込み開始データのPビット列のビットが0以外の場合、データ処理装置100は、Pビット列のスキャンデータとマスタマスクとをAND演算した結果によりマスタマスクを更新する(S516)。その後、データ処理装置100は、S514でテンポラリ変数が0だった場合も含め、Pビット列のスキャンデータのNOT演算結果とファーストマスクをAND演算した結果をテンポラリ変数に設定する(S517)。その後、データ処理装置100は、テンポラリ変数が0か否かを判定する(S518)。S518でテンポラリ変数が0以外の場合、すなわち、S517のビットスキャンにより行われた、小さな値への絞り込みが有効だった場合、データ処理装置100は、テンポラリ変数の内容をファーストマスクに設定し、最初のグルーピング結果を更新する(S519)。
S515、またはS519の後、あるいはS518でテンポラリ変数が0の場合、データ処理装置100は、処理中のビット列である変数PがLSBか否か、すなわち、全ビットのスキャンが終了したか否か判定する(S520)。S520で変数PがLSB以外の場合、すなわち、全ビットのスキャンが終了していない場合、データ処理装置100は、次のスキャンのために、変数PをLSB側に一つ移動し(S521)、S512以降で次のビット列に対するビットスキャン処理(絞り込み処理)を繰り返す。
また、S520で変数PがLSBである場合、すなわち、全ビットのスキャンが終了した場合、データ処理装置100は、最初のグルーピング結果として、ファーストマスクの内容を出力する(S522)。続いて、データ処理装置100は、ファーストマスクのNOT演算結果と絞り込み開始データよりも大きいデータの検索結果(大なり検索結果)であるスタートマスクをAND演算した結果をマスタマスクに設定する(S523)。その後、このマスタマスクを使い、実施の形態1で示した昇順のグルーピングソートを使って後続のグルーピングソート処理を行う(S524)。なお、絞り込み開始データ以上の検索結果(大なりイコール検索結果)とする場合は、S522の前に、その時点のマスタマスク(同値結果)が0か否かを判定し、0以外なら(同値があれば)、マスタマスクをファーストマスクに設定する。
なお、図13と同様、昇順の処理の一部を変更することで、降順のポジショナルグルーピングソート処理を行うことができる。具体的には、降順の場合、図15の昇順のフローチャートに対し、S512、S513、S516、S517、S524の処理を変更する。すなわち、S512では、絞り込み開始データのPビット列のビットが1(ON)か否か判定する。S513では、絞り込み開始データのPビット列のビットが1の場合に、テンポラリ変数(Tmp)にマスタマスク(Mask)を設定し、Pビット列のスキャンデータとマスタマスクとをAND演算した結果によりマスタマスクを更新し、続けて、テンポラリ変数とマスタマスクとをXOR演算した結果で、テンポラリ変数を更新する。S516では、絞り込み開始データのPビット列のビットが1以外の場合に、Pビット列のスキャンデータのNOT演算結果とマスタマスクとをAND演算した結果によりマスタマスクを更新する。S517では、S514でテンポラリ変数が0だった場合も含め、Pビット列のスキャンデータとファーストマスクをAND演算することで、大きな値への絞り込みを行った結果をテンポラリ変数に設定する。S524では、S523のマスタマスクの更新後に、実施の形態1で示した降順のグルーピングソート処理を行う。
<大なり検索処理の動作例>
図16A及び図16Bは、本変形例の動作例であり、図12に示した、昇順のポジショナルグルーピングソートにおける大なり検索処理の動作例の変形例である。
図16A及び図16Bの例では、大なり検索のための比較値(絞り込み開始データ)は5であり、レコード番号0~5の6レコードのデータが入力される。レコード番号0のデータ値が3、レコード番号1のデータ値が7、レコード番号2のデータ値が5、レコード番号3のデータ値が15、レコード番号4のデータ値が6、レコード番号5のデータ値が10である。各データはビット列[0]~[3]の4ビットのデータあり、スキャンデータ及びマスクデータは6ビットである。
図16A及び図16Bに示すように、マスタマスク(ExistMask)の初期値は“111111”であり(S611)、ファーストマスク(FirstMask)の初期値は“000000”であり(S612)、スタートマスク(GreaterMask)の初期値は“000000”である(S613)。
まず、比較値のビット列[3]が0であるため、ビット列[3]のスキャンデータに対しビットスキャン処理及びファーストマスクとスタートマスクの更新処理を行う。具体的には、マスタマスク“111111”をマスクデータとして、ビット列[3]のスキャンデータ“000101”をNOT演算した結果“111010”をマスクにかけ、マスク結果が“111010”となる(S614)。さらに、マスクデータ“111111”とマスク結果“111010”をXOR演算した結果“000101”でファーストマスクを更新し、続けてファーストマスクとスタートマスク“000000”をOR演算し、その結果によりスタートマスクを“000101”とする(S615)。
次に、比較値のビット列[2]が1であるため、ビット列[2]のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、ビット列[3]のマスク結果“111010”をマスクデータとして、ビット列[2]のスキャンデータ“011110”をマスクにかけ、マスク結果が“011010”となる(S616)。さらに、ビット列[3]で更新したファーストマスク“000101”に対し、ビット列[2]のスキャンデータ“011110”をNOT演算した結果“100001”をAND演算し、その結果でファーストマスクを“000001”とする(S617)。
次に、比較値のビット列[1]が0であるため、ビット列[1]のスキャンデータに対しビットスキャン処理及びファーストマスクとスタートマスクの更新処理を行う。具体的には、ビット列[2]のマスク結果“011010”をマスクデータとして、ビット列[1]のスキャンデータ“110111”をNOT演算した結果“001000”をマスクにかけ、マスク結果が“001000”となる(S618)。さらに、マスクデータ“011010”とマスク結果“001000”をXOR演算した結果“010010”でファーストマスクを更新し、続けてファーストマスクとスタートマスク“000101”をOR演算し、その結果により、スタートマスクを“010111”とする(S619)。
次に、比較値のビット列[0]が1であるため、ビット列[0]のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、ビット列[1]のマスク結果“001000”をマスクデータとして、ビット列[0]のスキャンデータ“111100”をマスクにかけ、マスク結果が“001000”となる(S620)。さらに、ビット列[1]で更新したファーストマスク“010010”に対し、ビット列[0]のスキャンデータ“111100”をNOT演算した結果“000011”をAND演算し、その結果でファーストマスクを“000010”とする(S621)。
これにより、ビット列[0]のマスク結果“001000”が同値検索の結果となる(S622)。すなわち、“001000”のONビットのレコード番号2が比較値5と同値のデータとなる。また、ビット列[1]で更新されたスタートマスク“010111”が大なり検索の結果となる(S623)。すなわち、“010111”のONビットのレコード番号1、3、4,5が比較値5よりも大きいデータとなる。さらに、ビット列[0]で設定したファーストマスク“000010”が、最初のポジショナルグルーピング結果となる(S624)。すなわち、“000010”のONビットのレコード番号4が、大なり検索で比較値5に最も近いポジショナルグルーピングデータとなる。
なお、後続のグルーピング処理は、ファーストマスク“ 000010”をNOT演算した結果“111101”と、S623で得た大なり検索のマスク“010111”をAND演算した結果である“010101”をマスタマスクとして、基本グルーピングソート(昇順)を行うことで実施する(S625)。また、大なりイコールに対応する場合は、同値の結果“001000”を最初のポジショナルグルーピング結果とし、S623で得た大なり検索のマスク“010111”を基本グルーピングソート(昇順)のマスタマスクに引き継ぐことで処理を行う。
このように、本変形例では、スタートマスク(GreaterMask)に加えてファーストマスク(FirstMask)を用意し、このファーストマスクに、比較値のビットがOFFのビット列について、検索先のデータビットがONの箇所を設定し、同時に、ファーストマスクをスタートマスクに論理和(OR)していくことにより、比較値よりも大きく、比較値により近いデータと、大なり検索の結果が得られる。その後は、ファーストマスクを昇順のグルーピング処理と同じく、最小値に向かってスキャンダウンしていくことで、一回のスキャンダウン処理で最初のグルーピング結果と、大なり検索の結果を同時に得られる。本変形例では、この処理により得られるファーストマスクを最初のポジショナルグルーピングの結果とし、以降のグルーピングはスタートマスクからファーストマスクを外したマスク結果を基本グルーピングソート(昇順)開始時のマスクデータとして実施する。また、大なりイコール(比較値以上)のデータを検索する場合は、同値結果を最初のグルーピング結果とし、スタートマスクを基本グルーピングソート(昇順)開始時のマスクデータとする。
<小なり検索処理の動作例>
図17A及び図17Bは、本変形例の他の動作例であり、図14に示した、降順のポジショナルグルーピングソートにおける小なり検索処理の動作例の変形例である。図17A及び図17Bの例では、小なり検索のための比較値(絞り込み開始データ)及び入力されるデータは図16A及び図16Bと同じである。
図17A及び図17Bに示すように、マスタマスク(ExistMask)の初期値は“111111”であり(S711)、ファーストマスク(FirstMask)の初期値は”000000”であり(S712)、スタートマスク(LessMask)の初期値は“000000”である(S713)。
まず、比較値のビット列[3]が0であるため、ビット列[3]のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、マスタマスク“111111”をマスクデータとして、ビット列[3]のスキャンデータ“000101”をNOT演算した結果“111010”をマスクにかけ、マスク結果が“111010”となる(S714)。さらに、初期値であるファーストマスク“000000”に対し、ビット列[3]のスキャンデータ“000101”をAND演算し、その結果がオール0(“000000”)となるため、ファーストマスクの更新は行わない(S715)。
次に、比較値のビット列[2]が1であるため、ビット列[2]のスキャンデータに対しビットスキャン処理及びファーストマスクとスタートマスクの更新処理を行う。具体的には、ビット列[3]のマスク結果“111010”をマスクデータとして、ビット列[2]のスキャンデータ“011110”をマスクにかけ、マスク結果が“011010”となる(S716)。さらに、マスクデータ“111010”とマスク結果“011010”をXOR演算した結果“100000”でファーストマスクを更新し、続けてファーストマスクとスタートマスク“000000”をOR演算し、その結果によりスタートマスクを“100000”とする(S717)。
次に、比較値のビット列[1]が0であるため、ビット列[1]のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、ビット列[2]のマスク結果“011010”をマスクデータとして、ビット列[1]のスキャンデータ“110111”をNOT演算した結果“001000”をマスクにかけ、マスク結果が“001000”となる(S718)。さらに、ビット列[2]で更新したファーストマスク“100000”に対し、ビット列[1]のスキャンデータ“110111”をAND演算し、その結果でファーストマスクを“100000”とする(S719)。
次に、比較値のビット列[0]が1であるため、ビット列[0]のスキャンデータに対しビットスキャン処理とファーストマスクの更新処理を行う。具体的には、ビット列[1]のマスク結果“001000”をマスクデータとして、ビット列[0]のスキャンデータ“111100”をマスクにかけ、マスク結果が“001000”となる(S720)。さらに、マスクデータ“001000”とマスク結果“001000”をXOR演算するが、この結果はオール0(“000000”)のため、ビット列[1]で更新したファーストマスク“100000”に対し、ビット列[0]のスキャンデータ“111100”をAND演算し、その結果でファーストマスクを“100000”とする(S721)。
これにより、ビット列[0]のマスク結果“001000”が同値検索の結果となる(S722)。すなわち、“001000”のONビットのレコード番号2が比較値5と同値のデータとなる。また、ビット列[2]で更新されたスタートマスク“100000”が小なり検索の結果となる(S723)。すなわち、“100000”のONビットのレコード番号0が比較値5よりも小さいデータとなる。さらに、ビット列[0]で設定したファーストマスク“100000”が、最初のポジショナルグルーピング結果となる(S724)。すなわち、“100000”のONビットのレコード番号0が、小なり検索で比較値5に最も近い、ポジショナルグルーピングデータとなる。
なお、この例では、ファーストマスク“100000”をNOT演算した結果“011111”と、S723で得た小なり検索のマスク“100000”をAND演算すると結果がオール0(“000000”)となるため、後続の基本グルーピングソート(降順)で処理するデータは無いことを示す(S725)。また、小なりイコールに対応する場合は、同値の結果“001000” を最初のポジショナルグルーピング結果とし、S723で得た小なり検索のマスク“100000”を基本グルーピングソート(降順)のマスタマスクに引き継ぐことで処理を行う。
このように、本変形例では、スタートマスク(LessMask)に加えてファーストマスク(FirstMask)を用意し、このファーストマスクに、比較値のビットがONのビット列について、検索先のデータビットがOFFの箇所を設定し、同時に、ファーストマスクをスタートマスクに論理和(OR)していくことにより、比較値よりも小さく、比較値により近いデータと、小なり検索の結果が得られる。その後は、ファーストマスクを降順のグルーピング処理と同じく、最大値に向かってスキャンダウンしていくことで、一回のスキャンダウン処理で最初のグルーピング結果と、小なり検索の結果を同時に得られる。本変形例では、この処理により得られるファーストマスクを最初のポジショナルグルーピングの結果とし、以降のグルーピングはスタートマスクからファーストマスクを外したマスク結果を基本グルーピングソート(降順)開始時のマスクデータとして実施する。また、小なりイコール(比較値以下)データを検索する場合は、同値結果を最初のグルーピング結果とし、スタートマスクを基本グルーピングソート(降順)開始時のマスクデータとする。
(実施の形態4)
次に、実施の形態4について説明する。本実施の形態では、実施の形態1~3のデータ処理装置において、スキャンデータを分割し、分割したスキャンデータを並列に処理する例について説明する。
<データ処理装置の構成>
図18は、本実施の形態に係るデータ処理装置の構成例を示している。図18に示すように、本実施の形態に係るデータ処理装置100は、実施の形態1の構成に加えて、分割部121を備えており、また、2つのスキャンダウン部140a及び140bを備えている。
分割部121は、取得部120が取得したスキャンデータをスキャンダウン部140a及び140bが処理できるように2つの分割スキャンデータに分割する。例えば、システムの処理単位(ワード単位)毎にデータを分割してもよい。スキャンダウン部140aは、分割部121が分割した一方の分割スキャンデータに対しスキャンダウン処理を行う。スキャンダウン部140bは、分割部121が分割した他方の分割スキャンデータに対しスキャンダウン処理を行う。例えば、1つのスキャンダウン部において、2つのスキャンダウン処理を並列に実行してもよい。なお、スキャンデータを複数の分割スキャンデータに分割し、分割スキャンデータ毎に複数の処理を並列に実行してもよい。
<分割スキャンデータによる昇順の基本グルーピングソート処理の動作例>
図19A及び図19Bは、本実施の形態に係るデータ処理方法によるデータ処理の動作例を示している。図19A及び図19Bは、スキャンデータを分割した分割スキャンデータを用いて、基本グルーピングソート処理を昇順に行う場合の例である。
なお、分割スキャンデータ毎のスキャンダウン処理は、基本的に実施の形態1と同様であるが、マスク結果の0判定の処理(図3のS103)のみが異なる。すなわち、分割スキャンデータ毎にビットスキャン処理を行い、全ての分割スキャンデータのマスク結果が0の場合にそのマスク結果を無効とし、以前に有効だったマスク結果を使用して処理を行う(以下のS814,S815参照)。逆に、複数の分割データのマスク結果が0の場合でも、いずれかの分割データのマスク結果が0でない場合(いずれかのマスク結果にONビットがある場合)は、そのマスク結果は有効として処理する(以下のS804,S805参照)。
図19A及び図19Bの例では、レコード番号0~6の7レコードのデータが入力される。レコード番号0のデータ値が0、レコード番号1のデータ値が5、レコード番号2のデータ値が10、レコード番号3のデータ値が3、レコード番号4のデータ値が10、レコード番号5のデータ値が5、レコード番号6のデータ値が3である。各データはビット列[0]~[3]の4ビットのデータである。
スキャンデータは7ビットであり、2つに分割したデータを分割スキャンデータとする。第1分割スキャンデータをレコード0~3のビットに対応する4ビットとし、第2分割スキャンデータをレコード4~6のビットに1ビット加えた4ビットとする。マスクデータは、2つの分割スキャンデータに対応して、4ビットの第1マスクデータ及び4ビットの第2マスクデータとする。
図19Aに示すように、1回目のスキャンダウン処理において、第1マスタマスクの初期値は、全ビットをONとした“1111”であり、第2マスタマスクの初期値は、最下位ビット(レコード番号7に該当するビット)をOFF、他のビットをONとした“1110”である(S801)。
ビット列[3]のビットスキャン処理では、第1マスクデータを“1111”として、第1分割スキャンデータ“0010”をNOT演算した結果“1101”を使ってマスクをかけ、第1マスク結果が“1101”となり、第2マスクデータを“1110”として、第2分割スキャンデータ“100”に最下位ビット(値は0)を加えてNOT演算した“0111”を使ってマスクをかけ、第2マスク結果が“0110”となる(S802)。
ビット列[2]のビットスキャン処理では、ビット列[3]の第1マスク結果“1101”をマスクデータとして、第1分割スキャンデータ“0100”をNOT演算した結果“1011”を使ってマスクをかけ、第1マスク結果が“1001”となり、ビット列[3]の第2マスク結果“0110”をマスクデータとして、第2分割スキャンデータ“010”に最下位ビットを加えてNOT演算した“1011”を使ってマスクをかけ、第2マスク結果が“0010”となる(S803)。
ビット列[1]のビットスキャン処理では、ビット列[2]の第1マスク結果“1001”をマスクデータとして、第1分割スキャンデータ“0011”をNOT演算した結果“1100”を使ってマスクをかけ、第1マスク結果が“1000”となり、ビット列[2]の第2マスク結果“0010”をマスクデータとして、第2分割スキャンデータ“101”に最下位ビットを加えてNOT演算した“0101”を使ってマスクをかけ、第2マスク結果がオール0(“0000”)となる(S804)。なお、この時点で第2マスク結果が0であるが、第1マスク結果が0以外のため、絞り込みは成功と判断され、ここでのマスク結果をそのまま次のマスクデータとして引き継ぐ。
ビット列[0]のビットスキャン処理では、ビット列[1]の第1マスク結果“1000”をマスクデータとして、第1分割スキャンデータ“0101”をNOT演算した結果“1010”を使ってマスクをかけ、第1マスク結果が“1000”となり、ビット列[1]の第2マスク結果“0000”をマスクデータとして、第2分割スキャンデータ“011”に最下位ビットを加えてNOT演算した“1001”を使ってマスクをかけ、第2マスク結果がオール0となる(S805)。なお、ここでも第2マスク結果が0であるが、第1マスク結果が0以外のため、絞り込みは成功と判断され、ここでのマスク結果をそのまま次のマスクデータとして引き継ぐ。
1回目のスキャンダウン処理の結果は、ビット列[0]の第1マスク結果“1000”とビット列[0]の第2マスク結果“0000”とを結合した結果となる(S806)。すなわち、“10000000”のONビットのレコード番号0が最小値のデータとして出力される。
また、現在の第1マスタマスク“1111”と第1マスタマスクに対応する1回目のスキャンダウン処理結果をNOT演算した結果“0111”とのマスクにより、2回目のスキャンダウン用の新しい第1マスタマスクを“0111”とし、現在の第2マスタマスク“1110”と第2マスタマスクに対応する1回目のスキャンダウン処理結果をNOT演算した結果“1111”とのマスクにより、2回目のスキャンダウン用の新しい第2マスタマスクを“1110”とする(S807)。
次に、2回目のスキャンダウン処理では、新しい第1マスタマスク“0111”、第2マスタマスク“1110”を用いて(S811)、レコード番号1~6のデータをソート対象として、1回目のスキャンダウン処理と同様にビットスキャン処理を行う。
ビット列[3]のビットスキャン処理では、第1分割スキャンデータの第1マスク結果は“0101”となり、第2分割スキャンデータの第2マスク結果は“0110”となる(S812)。ビット列[2]のビットスキャン処理では、第1分割スキャンデータの第1マスク結果は“0001”となり、第2分割スキャンデータの第2マスク結果は“0010”となる(S813)。ビット列[1]のビットスキャン処理では、第1分割スキャンデータの第1マスク結果はオール0となり、第2分割スキャンデータの第2マスク結果はオール0となる(S814)。両方のマスク結果がすべて0に成るため、この場合は絞り込みが成立せず、この絞り込み動作は無効と判断される。
ビット列[0]のビットスキャン処理では、ビット列[1]の第1マスク結果及び第2マスク結果の両方が0であり、無効となるため、ビット列[2]の第1マスク結果及び第2マスク結果を使用する。すなわち、ビット列[2]の第1マスク結果“0001”をマスクデータとして、第1分割スキャンデータのマスク結果がオール0となり、ビット列[2]の第2マスク結果“0010”をマスクデータとして、第2分割スキャンデータのマスク結果がオール0となる(S815)。この結果も、両方のマスク結果がすべて0に成るため、S814同様絞り込み動作は無効と判断される。
2回目のスキャンダウン処理の結果は、ビット列[0]の第1マスク結果及び第2マスク結果が0であり、ビット列[1]の第1マスク結果及び第2マスク結果も0であり、いずれも無効となるため、ビット列[2]の第1マスク結果“0001”とビット列[2]の第2マスク結果“0010”とを結合した結果となる(S816)。すなわち、“00010010”のONビットのレコード番号3、6が2番目に小さいデータとして出力される。
また、現在の第1マスタマスク“0111”と第1マスタマスクに対応する2回目のスキャンダウン処理結果をNOT演算した結果“1110”とのマスクにより、3回目のスキャンダウン用の新しい第1マスタマスクを“0110”とし、現在の第2マスタマスク“1110”と第2マスタマスクに対応する2回目のスキャンダウン処理結果をNOT演算した結果“1101”とのマスクにより、3回目のスキャンダウン用の新しい第2マスタマスクを“1100”とする(S817)。3回目以降、1回目及び2回目と同様、スキャンダウン処理が繰り返される。
<本実施の形態の効果>
以上のように、本実施の形態では、スキャンダウンによるグルーピングソート処理において、スキャンデータを分割し、分割したデータに対し並列にグルーピングソート処理を行う。入力データのレコードの格納数が多く、一つの操作幅ではビットの横幅が不足するような場合、すなわち、スキャンデータのビット幅が処理単位に収まらない場合、複数のデータに分けて、データ毎にスキャンダウン処理を行うことで、レコード数(横幅)を必要な個数まで拡張することができる。
(実施の形態5)
次に、実施の形態5について説明する。本実施の形態では、実施の形態1~4のデータ処理装置において、昇順ソート処理と降順ソート処理を同時に行う例について説明する。
<データ処理装置の構成>
図20は、本実施の形態に係るデータ処理装置の構成例を示している。図20に示すように、本実施の形態では、スキャンダウン部140が昇順処理部141と降順処理部142を含んでいる。昇順処理部141は、取得部120が取得したスキャンデータに対し、入力データを昇順にソートするスキャンダウン処理を行う。降順処理部142は、取得部120が取得したスキャンデータに対し、入力データを降順にソートするスキャンダウン処理を行う。
<デュアルスキャン方式のグルーピングソート処理の動作例>
図21A及び図21Bは、本実施の形態に係るデータ処理の動作例を示している。図21A及び図21Bは、昇順ソートと降順ソートを同時に行うデュアルスキャン方式のグルーピングソート処理の例である。昇順ソートと降順ソートの処理は、基本的に実施の形態1と同様である。図21A及び図21Bの例では、図9A及び図9Bと同じ4レコードのデータが入力される。また、スキャンデータ、昇順及び降順のマスクデータは4ビットである。
図21Aに示すように、1回目のスキャンダウン処理において、マスタマスクの初期値は“1111”であり(S801)、同じマスタマスクで昇順ソート及び降順ソートを行う。ビット列[3]のビットスキャン処理では、昇順ソートのマスク結果が“1101”となり(S802a)、降順ソートのマスク結果が“0010”となる(S802b)。ビット列[2]のビットスキャン処理では、昇順ソートのマスク結果が“1001”となり(S803a)、降順ソートのマスク結果がオール0(“0000”)となる(S803b)。ビット列[1]のビットスキャン処理では、昇順ソートのマスク結果が“1000”となり(S804a)、降順ソートのマスク結果が“0010”となる(S804b)。ビット列[0]のビットスキャン処理では、昇順ソートのマスク結果が“1000”となり(S805a)、降順ソートのマスク結果がオール0となる(S805b)。
1回目のスキャンダウン処理では、昇順ソートの結果は、ビット列[0]のマスク結果“1000”となり(S806a)、降順ソートの結果は、ビット列[1]のマスク結果“0010”となる(S806b)。すなわち、“1000”のONビットのレコード番号0が最小値のデータとして出力され、“0010”のONビットのレコード番号2が最大値のデータとして出力される。
また、現在のマスタマスク“1111”と1回目の昇順ソート結果をNOT演算した結果“0111”とをマスクし、そのマスク結果“0111”と1回目の降順ソート結果をNOT演算した結果“1101”とをマスクし、そのマスク結果“0101”を、次の2回目のスキャンダウン用の新しいマスタマスクとする(S807)。
次に、2回目のスキャンダウン処理では、新しいマスタマスク“0101”を用いて(S811)、レコード番号1、3のデータをソート対象として、1回目のスキャンダウン処理と同様にビットスキャン処理を行う。ビット列[3]のビットスキャン処理では、昇順ソートのマスク結果は“0101”となり(S812a)、降順ソートのマスク結果はオール0となる(S812b)。ビット列[2]のビットスキャン処理では、昇順ソートのマスク結果は“0001”となり(S813a)、降順ソートのマスク結果は“0100”となる(S813b)。ビット列[1]のビットスキャン処理では、昇順ソートのマスク結果はオール0となり(S814a)、降順ソートのマスク結果はオール0となる(S814b)。ビット列[0]のビットスキャン処理では、昇順ソートのマスク結果はオール0となり(S815a)、降順ソートのマスク結果は“0100”となる(S815b)。
2回目のスキャンダウン処理では、昇順ソートの結果は、ビット列[2]のマスク結果“0001”となり(S816a)、降順ソートの結果は、ビット列[0]のスキャンデータのマスク結果“0100”となる(S816b)。すなわち、“0001”のONビットのレコード番号3が2番目に小さいデータとして出力され、“0100”のONビットのレコード番号1が2番目に大きいデータとして出力される。
また、現在のマスタマスク“0101”と2回目の昇順ソート結果をNOT演算した結果“1110”とをマスクし、そのマスク結果“0100”と2回目の降順ソート結果をNOT演算した結果“1011”とをマスクし、そのマスク結果が“0000”となり、全ビットがオフのため、処理を終了する(S817)。
図21A及び図21Bの例では、1回目のソート処理の結果は、昇順及び降順ソート個数=2、昇順ソートレコード番号=(0)、降順ソートレコード番号=(2)となり、2回目のソート処理の結果は、昇順及び降順ソート個数=2、昇順ソートレコード番号=(3)、降順ソートレコード番号=(1)となり、最終的なソート処理結果は、昇順及び降順ソート個数=4、昇順ソートレコード番号=(0),(3)、降順ソートレコード番号=(2),(1)となる。なお、昇順ソートと降順ソートのループ回数が奇数で終わる場合、最後の処理結果で昇順と降順に同じ値が得られるため、この場合はいずれか一方を採用する。
<本実施の形態の効果>
以上のように、本実施の形態では、スキャンダウンによるグルーピングソート処理において、昇順のグルーピングソートと降順のグルーピングソートを同時に行う。マスタマスクを昇順ソートと降順ソートの2系統で使用しスキャンすることで、昇順ソートのスキャン結果と降順ソートのスキャン結果を一回のスキャンダウンで同時に求めることができる。昇順ソートと降順ソートの2つの処理を同時に行うため、単純にグルーピングを行う処理ループの回数を半分に減らすことができる。
(実施の形態6)
次に、実施の形態6について説明する。本実施の形態では、実施の形態1~5のデータ処理装置において、マスク結果をスタックする例について説明する。
<データ処理装置の構成>
図22は、本実施の形態に係るデータ処理装置の構成例を示している。図22に示すように、本実施の形態に係るデータ処理装置100は、実施の形態1の構成に加えて、スタック部133を備えている。スタック部133は、スキャンダウン部140におけるビットスキャン処理のマスク結果とスキャン位置をスタックする。また、スキャンダウン部140は、スタックされたマスク結果に対応するスキャン位置からスキャンダウン処理を開始する。
<スタック方式の昇順のグルーピングソート処理の処理フロー>
図23は、本実施の形態に係るデータ処理方法のフローチャートを示している。図23は、マスク結果をスタックするスタック方式のグルーピングソート処理を昇順に行う場合の例である。
図23に示すように、まず、データ処理装置100は、初期化処理として、スタックレベル変数(StackLevel)を0に初期化し、スタックの先頭であるレベル0のスタックマスク値にマスタマスク(Mask)を、スタックスキャン位置にMSB位置を設定する(S901)。なお、この例では、スタックにはスタックマスク値(Stack[].mask)とスタックスキャン位置(Stack[].pos)の2つの項目が含まれるものとして説明する。
次に、データ処理装置100は、スキャンダウン処理を開始するため、マスクデータである変数Aにスタックレベルのスタックマスク値を設定し、変数Pに同じスタックのスタックスキャン位置を設定する(S902)。次にデータ処理装置100は、変数PがLSB以上であるかを判定する(S903)。すなわち、スキャン動作がLSBに到達していない場合はS904に進み、LSBまで処理を終えた場合はS910に進む。
次に、データ処理装置100は、昇順ソートのマスク処理として、Pビット列のスキャンデータのNOT演算結果とマスクデータである変数AとをAND演算し、その演算結果をマスク結果である変数Bに設定する(S904)。
次に、データ処理装置100は、スキャン位置である変数Pをデクリメントする。すなわち、スキャン位置をLSB側に移動する。(S905)
次に、データ処理装置100は、マスク処理結果である変数Bが0か否か、すなわち、絞り込みが成功したか、もしくは、変数Bが変数Aと同じか否か、すなわち、ビットスキャンによりマスクが変化したか否かを判定する(S906)。
S906でマスク処理結果である変数Bが0以外、かつ変数Bが変数Aと異なる場合、すなわち、絞り込みが成功し、マスクの変化が起こった場合、データ処理装置100は、スタックレベルのスタックマスク値に変数Aを設定し、同じスタックのスタックスキャン位置に変数Pを設定する(S907)。その後、スタックレベル変数をインクリメントする(S908)。さらに、マスクデータである変数Aをマスク結果である変数Bにより更新し(S909)、S903以降で次のビット列に対するビットスキャン処理を繰り返す。
また、S903で変数Pが0より下になった場合、すなわち、全ビットのスキャンが終了した場合、データ処理装置100は、S909で更新されたマスクデータである変数Aを結果として出力する(S910)。次に、データ処理装置100は、マスタマスクとマスクデータである変数AのNOTの結果をAND演算し、その演算結果によりマスタマスクを更新する(S911)。
次に、データ処理装置100は、更新したマスタマスクが0か否か、すなわち、全データ処理が終了したか否か判定する(S912)。S912でマスタマスクが0以外の場合、すなわち、全データ処理が終了していない場合、データ処理装置100は、スタックレベル変数をデクリメントし(S913)、そのスタックレベルのスタックマスク値とマスタマスクとをAND演算し、その結果で同じスタックマスクを更新する(S914)。その後、S902以降で、スタックされたスタックマスク値とスタックスキャン位置を用いて、スキャンダウン処理を繰り返す。また、S912でマスタマスクが0の場合、すなわち、全データ処理が終了した場合、処理を終了する。
以上のように、本実施の形態では、前記に示したビットスキャンによるスキャンダウンの途中経過をスタックに蓄積していくことにより、次の回のスキャンダウン開始位置を、MSB位置でなく、変化が生じる最も低いビット列の位置から開始することが出来る。
なお、実施の形態1の図4と同様に、処理結果の早期検出を行ってもよい。すなわち、S909の後、変数AのONビットが一つのみか否か判定し、変数AのONビットが一つのみではない場合はS903に進み、変数AのONビットが一つのみの場合はS910に進んでもよい。また、実施の形態1の図6と同様に、降順ソートを行う場合、S904において、Pビット列のスキャンデータと変数AとをAND演算し、そのAND演算の結果を変数Bに設定してもよい。
<スタック方式の昇順のグルーピングソート処理の動作例>
図24A及び図24Bは、本実施の形態に係るデータ処理の動作例を示している。図24A及び図24Bは、図23に示したようにスタック方式のグルーピングソート処理を昇順に行う場合の例である。図24A及び図24Bの例では、レコード番号0~3の4レコードのデータが入力される。レコード番号0のデータ値が15、レコード番号1のデータ値が2、レコード番号2のデータ値が14、レコード番号3のデータ値が5である。各データはビット列[0]~[3]の4ビットデータであり、スキャンデータ及びマスクデータも4ビットである。
図24Aに示すように、最初に、処理の開始に伴うスタックの初期化を行う。具体的には、スタックレベルを“0”に設定し、スタック[0]のスタックマスク値にマスタマスクである“1111”を設定し、スタックスキャン位置にMSB位置である“3”を設定する(S1001)。
スキャンダウン処理では、まず、スタックレベル“0”の位置に当たるスタック[0]からスタックスキャン位置の“3”と、スタックマスクである“1111”を取得し、各々スキャン位置とマスクデータに設定する(S1002)。
次に、取得した“1111”をマスクデータとして、スキャン位置“3”に当たるビット列[3]をビットスキャンすることで、マスク結果が“0101”となり、スキャン位置はデクリメントすることで“2”となる(S1003)。この処理により、マスク結果が0ではなく、かつ、マスクデータの“1111”とも同じではないため、現在のスタックレベルである“0”の指すスタック[0]のスタックマスクにマスクデータ“1111”を設定し、スタックスキャン位置に、現在のスキャン位置である“2”を設定する。つまり、この時点で、S1001でスタック[0]に設定した初期値を、上書きにより更新する。その後、スタックレベルをカウントアップして“1”にし、マスクデータをマスク結果である“0101”に更新する(S1004)。
次に、“0101”をマスクデータとして、スキャン位置“2”に当たるビット列[2]をビットスキャンすることで、マスク結果が“0100”となり、スキャン位置はデクリメントすることで“1”となる(S1005)。この処理により、マスク結果が0ではなく、かつ、マスクデータの“0101”とも同じではないため、現在のスタックレベルである“1”の指すスタック[1]のスタックマスクとしてマスクデータ“0101”を設定し、スタックスキャン位置に現在のスキャン位置である“1”を設定する。その後、スタックレベルをカウントアップして“2”にし、マスクデータをマスク結果である“0100”に更新する(S1006)。
次に、“0100”をマスクデータとして、スキャン位置“1”に当たるビット列[1]をビットスキャンすることで、マスク結果がオール0(“0000”)となり、スキャン位置はデクリメントすることで“0”となる。このとき、マスク結果が0のため、スタック処理と、マスクデータの更新は行わず次のビットスキャン処理に移る(S1007)。
次のビットスキャンでは、引き継いだ“0100”をマスクデータとして、スキャン位置“0”に当たるビット列[0]をビットスキャンすることで、マスク結果が“0100”となり、スキャン位置はデクリメントすることで“-1”となる。このとき、マスク結果が0ではないが、マスクデータと同じであるため、スタック処理と、マスクデータの更新は行わず次の処理に移る(S1008)。
1回目のスキャンダウン処理の結果は、最終的なマスクデータである“0100”となる(S1009)。すなわち、“0100”のONビットのレコード番号1が最小値のデータとして出力される。また、現在のマスタマスク“1111”と1回目のスキャンダウン処理の結果をNOT演算した“1011”とのマスクにより、次の2回目のスキャンダウン用の新しいマスタマスクを“1011”とする(S1010)。さらに、スタックレベルを一つ戻して“1”とし、新しいマスタマスク“1011”と、戻したスタックレベル“1”の指すスタック[1]のスタックマスク“0101”とをANDし、その演算結果“0001”によって同スタックマスクの値を更新する(S1011)。
次に、2回目のスキャンダウン処理は、現在のスタックレベル“1”の指すスタック[1]に格納されているスタックスキャン位置“1”をスキャン位置とし、スタックマスク“0001”をマスクデータとして開始する(S1016)。最初のビット列[1]に対するマスク結果は“0001”となり、このとき、マスク結果が0ではないが、マスクデータ“0001”と同じため、スタック処理はされず、マスクデータの更新もされない(S1017)。
次に、ビット列[0]のビットスキャン処理では、引き継いだマスクデータ“0001”をマスクデータとして、マスク結果がオール0となり、マスク結果が0であるため、スタック処理はされず、マスクデータの更新もされない(S1018)。
2回目のスキャンダウン処理の結果は、最終的に引き継いだマスクデータである“0001”となる(S1019)。すなわち、“0001”のONビットのレコード番号3が2番目に小さいデータとして出力される。また、現在のマスタマスク“1011”と2回目のスキャンダウン処理結果をNOT演算した結果“1110”とのマスクにより、次の3回目のスキャンダウン用の新しいマスタマスクを“1010”とする(S1020)。さらに、スタックレベルを一つ戻して“0”とし、新しいマスタマスク“1010”と戻したスタックレベル“0”の指すスタック[0]のスタックマスク“1111”とをANDし、そのマスク結果“1010”によって同スタックマスクの値を更新する(S1021)。
次に、3回目のスキャンダウン処理は、現在のスタックレベル“0”の指すスタック[0]に格納されているスタックスキャン位置“2”をスキャン位置とし、スタックマスク“1010”をマスクデータとして開始する(S1024)。最初のビット列[2]に対するマスク結果はオール0となり、マスク結果が0のため、スタック処理はされず、マスクデータの更新もされない(S1025)。
次に、ビット列[1]のビットスキャン処理では、引き継いだマスクデータ“1010”をマスクデータとして、マスク結果がオール0となり、マスク結果が0であるため、スタック処理はされず、マスクデータの更新もされない(S1026)。
次に、ビット列[0]のビットスキャン処理では、引き継いだマスクデータ“1010”をマスクデータとして、マスク結果が“0010”となる(S1027)。このとき、マスク結果が0ではなく、かつ、マスクデータの“1010”とも同じではないため、現在のスタックレベルである“0”の位置に当たる、スタック[0]のスタックマスクとしてマスクデータ“1010”を設定し、スタックスキャン位置に現在のスキャン位置(今回のビット列[0]のスキャン後デクリメントしたため-1に成っている。)である“-1”を設定する。つまり、この時点で、S1021でスタック[0]に設定した値を、上書きにより更新する。その後、スタックレベルをカウントアップして“1”にし、マスクデータをマスク結果である“0010”に更新する(S1028)。
3回目のスキャンダウン処理の結果は、最終的なマスクデータである“0010”となる(S1029)。すなわち、“0010”のONビットのレコード番号2が3番目に小さいデータとして出力される。また、現在のマスタマスク“1010”と3回目のスキャンダウン処理結果をNOT演算した結果“1101”とをマスクし、次の4回目のスキャンダウン用の新しいマスタマスクを“1000”とする(S1030)。さらに、スタックレベルを一つ戻して“0”とし、新しいマスタマスク“1000”と、戻したスタックレベル“0”の指すスタック[0]のスタックマスク“1010”とをANDし、そのマスク結果“1000”によって同スタックマスクの値を更新する(S1031)。
次に、4回目のスキャンダウンは、現在のスタックレベル“0”の指すスタック[0]に格納されているスタックスキャン位置“-1”をスキャン位置とし、スタックマスク“1000”をマスクデータとして開始する。ここでは、スキャン位置が既に-1であり、LSBより下の位置を指しているため、ビットスキャンは行われず、マスクデータがそのまま結果となる(S1038)。
4回目のスキャンダウン処理の結果は、最終的なマスクデータ“1000”となる(S1039)。すなわち、“1000”のONビットのレコード番号0が4番目に小さいデータとして出力される。また、現在のマスタマスク“1000”と4回目のスキャンダウンの結果をNOT演算した結果“0111”をマスクすると、マスク結果が“0000”となり、全ビットがオフのため、処理を終了する(S1040)。図24A及び図24Bの例では、昇順のグルーピングソート処理の結果は、個数=4、レコード番号=(1),(3),(2)、(0)となる。
<本実施の形態の効果>
以上のように、本実施の形態では、スキャンダウンによるグルーピングソート処理において、スキャンダウンの際にマスクが変化した位置をスタックして行くことで、次のスキャンダウン開始位置を、直前のマスク変化位置から開始することができ、効率よく処理を行うことが可能となる。
すなわち、マスク結果とスキャン位置を積むスタックを用意し、スキャンダウン処理で全ビットが0以外、かつ、前のマスクと変化があった場合に、変化前のマスクとスキャン位置をスタックに積んでいく。処理をLSBまで終えた場合は、スタックを一つ戻し、そこに格納されているマスクと、マスタマスクのANDを取ったものを新たなマスクとし、スタックに格納されているスキャン位置から次のスキャンダウンを開始する。これにより、最上位からスキャンダウンを開始する必要が無く、処理シーケンススキップ部分の処理量を減らすことができる(図24Aの2回目のビット列[3]及びビット列[2]、図24Bの3回目のビット列[3]、同4回目のビット列全ての処理)。特に全体ビット桁数に比べ、有効ビット桁数が少ない場合に有効である。
図25は、実施の形態1における基本グルーピングソート方式と本実施の形態におけるスタック方式の処理の比較を示している。基本グルーピングソート方式のソートでは、値が例に示す(2,5,14,15)だった場合、図25(a)のように各スキャンダウン(P1~P4)で先頭ビット(MSB)から最下位ビット(LSB)までのスキャンが必要になる。この例では、各スキャンダウンで5回の処理(ビットスキャン処理)となるため、全データをソートするためには20回の処理が必要になる。これに対し、スタック方式の場合は、図25(b)のように直前の分岐位置からスキャンダウンを行うため、MSBからLSBまで全ビットをスキャンする必要がない。そうすると、この例では、スキャンダウン順に、P1=5回、P2=3回、P3=4回、P4=0回の処理となり、全データのソートを12回の処理で行うことができる。例えば、全体のビット数に比べ有効ビットが少ない場合や、絞り込みの結果、データに偏りが生じた場合などに効率よく処理することができる。なお、処理結果の早期検出を行う場合、さらに処理回数を減らすことができ、図25(b)では、P1のビット列[1]及びビット列[0]、P2のビット列[1]及びビット列[0]のスキャンダウン自体も不要になる。
(実施の形態7)
次に、実施の形態7について説明する。本実施の形態では、実施の形態1~5のデータ処理装置において、グルーピング結果に対し、ビットカウントにより積算を行う例について説明する。
<データ処理装置の構成>
図26は、本実施の形態に係るデータ処理装置の構成例を示している。図26に示すように、本実施の形態に係るデータ処理装置100は、実施の形態1の構成に加えて、ビットカウント部160、積算部161を備えている。
ビットカウント部160は、グルーピング処理結果のONビットをカウント(ビットカウント)するビットカウント処理を行う。また、グルーピング結果と複数のスキャンデータとをマスクした結果のビットをビットカウントする。例えば、処理結果マスクが“11011110”の場合、ビットカウント処理では、この結果マスクのONビットをカウントし、ビットカウント結果は6となる。
積算部161は、ビットカウント結果を用いて、グルーピングされたデータの積算処理を行う。積算部161は、マスク結果のビットカウント値に応じた値を積算する。具体的には、ビットカウント値をスキャンデータのビット位置に応じてビットシフトし、ビットシフトした値を合計する。なお、データ処理装置100は、少なくとも、ビットカウント部160と積算部161を備え、入力される複数のデータに対しビットカウント処理と積算処理を行ってもよい。
<ビットカウントによる積算処理の処理フロー>
図27は、本実施の形態に係るデータ処理方法のフローチャートを示している。図27は、ビットカウントを使った積算処理の例である。例えば、以下の処理は主に積算部161により実行され、ビットカウントの処理がビットカウント部160により実行されるが、これに限られない。
図27に示すように、まず、データ処理装置100は、積算処理の初期設定として、積算結果を0に初期化し、変数PにMSB位置を設定する(S1101)。次に、データ処理装置100は、積算結果を左に1ビットシフトする(S1102)。
次に、データ処理装置100は、マスタマスク(Mask)とPビット列の積算ビットデータとをAND演算し、そのAND演算の結果を変数Bに設定する(S1103)。積算ビットデータは、積算対象のデータの各ビット列データ(スキャンデータ)である。
次に、データ処理装置100は、マスク結果である変数Bをビットカウントし、そのビットカウント結果を積算結果に加算し、その加算結果により積算結果を更新する(S1104)。次に、データ処理装置100は、処理中のビット列である変数PがLSBか否か、すなわち、全ビットのスキャンが終了したか否か判定する(S1105)。
S1105で変数PがLSB以外の場合、すなわち、全ビットのスキャンが終了していない場合、データ処理装置100は、次のスキャンのために、変数PをLSB側に一つ移動し(S1106)、S1102以降の処理を繰り返す。また、S1105で変数PがLSBである場合、すなわち、全ビットのスキャンが終了した場合、データ処理装置100は、積算結果を出力する(S1107)。
<ビットカウントによる積算処理の動作例>
図28は、本実施の形態に係るデータ処理の動作例を示している。図28は、図27のようにビットカウントを使って積算処理を行う例である。
図28の例では、レコード番号0~7の8レコードのデータが入力される。レコード番号0のデータ値が0、レコード番号1のデータ値が5、レコード番号2のデータ値が10、レコード番号3のデータ値が3、レコード番号4のデータ値が2、レコード番号5のデータ値が6、レコード番号6のデータ値が8、レコード番号7のデータ値が9である。
例えば、図14で示した小なりイコールの検索処理と同様に、ビット列[3]~[0]をスキャンし、8以下のデータを検索すると、処理結果マスク“11011110”が得られる(S1200)。
まず、積算結果の初期値は0であり、左に1ビットシフトしても0である(S1201)。また、ビット列[3]のスキャンデータ“00100011”を処理結果マスクによりマスクすると、マスク結果が“00000010”となり、このマスク結果をビットカウントすると1となる(S1202)。このビットカウント結果を積算結果に加えると、“00001”(=1)となる(S1203)。
次に、現在の積算結果を1ビット左にシフトすると、“00010”(=2)となる(S1204)。また、ビット列[2]のスキャンデータ“01000100”を処理結果マスクによりマスクすると、マスク結果が“01000100”となり、このマスク結果をビットカウントすると2となる(S1205)。このビットカウント結果を積算結果に加えると、“00100”(=4)となる(S1206)。
次に、現在の積算結果を1ビット左にシフトすると、“01000”(=8)となる(S1207)。また、ビット列[1]のスキャンデータ“00111100”を処理結果マスクによりマスクすると、マスク結果が“00011100”となり、このマスク結果をビットカウントすると3となる(S1208)。このビットカウント結果を積算結果に加えると、“01011”(=11)となる(S1209)。
次に、現在の積算結果を1ビット左にシフトすると、“10110”(=22)となる(S1210)。また、ビット列[0]のスキャンデータ“01010001”を処理結果マスクによりマスクすると、マスク結果が“01010000”となり、このマスク結果をビットカウントすると2となる(S1211)。このビットカウント結果を積算結果に加えると、最終的な積算結果は“11000”(=24)となる(S1212)。
図29は、本実施の形態に係るデータ処理の他の動作例を示している。図29は、各ビット列でビットカウントを行い、最後に積算する例である。入力されるデータ及び処理結果マスクは図25と同じである。
まず、図28と同様に、ビット列[3]のスキャンデータを処理結果マスクによりマスクし、そのマスク結果をビットカウントすると1となる(S1202)。この積算方法では、ビット位置に応じてビットカウント値を左にシフトする。このときビット列[3]のため、このビットカウント結果“1”を3ビット左にシフトすると、“0001000”(=8)となる(S1221)。
次に、ビット列[2]のスキャンデータを処理結果マスクによりマスクし、そのマスク結果をビットカウントすると2となる(S1205)。このときビット列[2]のため、このビットカウント結果“2”を2ビット左にシフトすると、“0001000”(=8)となる(S1222)。
次に、ビット列[1]のスキャンデータを処理結果マスクによりマスクし、そのマスク結果をビットカウントすると3となる(S1208)。このときビット列[1]のため、このビットカウント結果“3”を1ビット左にシフトすると、“0000110”(=6)となる(S1223)。
次に、ビット列[0]のスキャンデータを処理結果マスクによりマスクし、そのマスク結果をビットカウントすると2となる(S1211)。このときビット列[0]のため、このビットカウント結果“2”を0ビット左にシフトすると(シフトしないのと同じ)、“0000010”(=2)となる(S1224)。
次に、ビット列[3]のビットカウント値のシフト結果“8”、ビット列[2]のビットカウント値のシフト結果“8”、ビット列[1]のビットカウント値のシフト結果“6”、ビット列[0]のビットカウント値のシフト結果“2”を合計すると、積算結果“24”となる(S1225)。本処理を使用しない一般的な積算方法では、0+5+3+2+6+8=24となるのに対し、本処理では、8+8+6+2により同じ結果を得ることができる。
<本実施の形態の効果>
以上のように、本実施の形態では、ビットカウントを使用して積算処理を行い、縦展開されたデータに対し高速な演算処理を可能とする。この方式では、各データの、横方向のビット列に対して、ビットカウントを求め、その結果をシフトしながら加算することで、積算を行う。この方式の計算量は、O(n/ビットカウント幅*データビットサイズ)となる。大量データに対し、ビットカウントを行う幅が広くなる、もしくは、有効データビットサイズが小さくなるに従い、計算は高速化される。
例えば、8ビットサイズ×256データに対し積算を行う場合、本方式を使用しない通常加算では256回の加算が必要となるが、本方式の256ビットのビットカウント型積算では、AND操作×8回+ビットカウント×8回+シフト×8回+加算×8回=32回の演算で完了する。
実施の形態1~6のようにグルーピングを行う際には、そのグループに属するデータのレコード数ならびに、そのグループの特定のフィールドの積算(Sum)値を同時に取得することが多い。上記のように、グループに属するレコード数のカウント処理は、単純にビットカウントにより結果マスクのONビット数(1のビットの数)を数えることによって得られる。本実施の形態の積算処理をグルーピングの演算結果に適用することで、効率よく積算結果を求めることができる。例えば、実施の形態1のグルーピングソート処理において積算を行う場合、図3のS107の後に、図27の積算処理を行う。
なお、レコード数のカウント処理と積算処理は結果マスクと積算を行うフィールドが決まれば実施することができるため、グルーピングの結果に限らず、全件積算や通常の絞り込み(検索)の結果に対しても適用できる。また、積算値とレコード数が求められれば、(積算値÷レコード数)を求めることで、平均値も容易に求めることができる。従って、平均値を使う分散や標準偏差などの計算にもこの処理を活用することができる。
(実施の形態8)
次に、実施の形態8について説明する。本実施の形態では、実施の形態1~7のデータ処理装置において、複数のテーブルのデータに対しJOIN処理を行う例について説明する。
<データ処理装置の構成>
図30は、本実施の形態に係るデータ処理装置の構成例を示している。図30に示すように、本実施の形態に係るデータ処理装置100は、実施の形態1の構成に加えて、JOIN処理部170を備えている。なお、データ処理装置100は、少なくとも、JOIN処理部170を備え、JOIN処理のみを行ってもよい。
JOIN処理部170は、2つのテーブルに対しJOIN処理を行う。JOIN処理とは、2つのデータ集合を特定のキーを使って結合し、双方のレコードの対応を取る処理である。JOIN処理には、FullOuter-JOIN、LeftOuter-JOIN、RightOuter-JOIN、Inner-JOINが含まれる。
FullOuter-Joinの場合、2つのテーブルのJOINキーを合わせて、グルーピング動作を行うことにより、2つのテーブルの全てのレコードを出力する。この際、双方のJOINキーの同一のレコードは、一つのグループ(JOINされた状態)として出力する。
LeftOuter-Joinの場合、左側(一方)のテーブルでグルーピング動作を行い、その結果出力された、データのJOINキーを使い、右側(他方)のテーブルを検索する。検索の結果、右側のテーブルに同じJOINキーのデータが存在すれば、左側のテーブルのグルーピング結果に、該当レコードを追加(JOINされた状態)して出力する。RightOuter-Joinの場合、LeftOuter-Joinの左と右のテーブルの操作が逆になる。
Inner-Joinの場合、最初に、左右のテーブル各々に対し、各々グルーピングする。左右のテーブルのグルーピングキーの値が異なる場合は、小さいキーを出力したテーブルに対し、大きいほうのグルーピングキーをポジショナルグルーピングの「以上」の絞り込み値に指定してポジショナルグルーピングを行う。両方のテーブルのグルーピングキーに同じ値が得られた場合は、その両方を合わせて(JOINされた状態)出力し、左右のテーブル各々に対し、各々次のグルーピングを得る。この動作を、いずれかのテーブルのデータが無くなるまで繰り返す。
<Inner-Joinの処理フロー>
図31は、本実施の形態に係るデータ処理に含まれるInnerーJOIN処理のフローチャートを示している。この例では、テーブルAとテーブルBに対しJOIN処理を行う。
図31に示すように、まず、データ処理装置100は、テーブルAとテーブルBの各々の基本グルーピング結果を取得(昇順、取得件数=1)する(S1301)。例えば、実施の形態2のように、昇順の基本グルーピングソートにより、各テーブルのデータをグルーピングし、指定された件数(1件)のデータを取得する。
次に、データ処理装置100は、両方のテーブルのグルーピング値が求まっているか(グルーピング結果があるか)否か判定する(S1302)。S1302で両方のテーブルのグルーピング値が求まっていない場合、データ処理装置100は処理を終了する。また、S1302で両方のテーブルのグルーピング値が求まっている場合、データ処理装置100は、両方のテーブルのグルーピング値が同じか否か判定する(S1303)。
S1303で両方のテーブルのグルーピング値が同じ場合、データ処理装置100は、両方のテーブルのグルーピング結果を合わせて出力(Join結果出力)する(S1304)。次に、データ処理装置100は、テーブルAとテーブルBの各々の次の基本グルーピング結果を取得(昇順、取得件数=1)し(S1305)、その後、S1302以降を繰り返す。
また、S1303で両方のテーブルのグルーピング値が異なる場合、データ処理装置100は、テーブルAのグルーピング値がテーブルBのグルーピング値より小さいか否か判定する(S1306)。S1306でテーブルAのグルーピング値がテーブルBのグルーピング値より小さい場合、データ処理装置100は、テーブルBのグルーピング値によりテーブルAをポジショナルグルーピングする(S1307)。すなわち、テーブルBのグルーピング値を絞り込み開始データに指定し、テーブルAを「以上(大なりイコール)」の条件でポジショナルグルーピング(昇順、取得件数=1)し、その後、S1302以降を繰り返す。ポジショナルグルーピングは、実施の形態3のように、グルーピングの最初に、絞り込み動作(昇順の場合は、より大きいもしくは以下、降順の場合は、より小さいもしくは以下)を加えた、任意の位置を開始点とするグルーピング処理である。
また、S1306でテーブルAのグルーピング値がテーブルBのグルーピング値以上の場合、データ処理装置100は、テーブルAのグルーピング値によりテーブルBをポジショナルグルーピングする(S1308)。すなわち、テーブルAのグルーピング値を絞り込み開始データに指定し、テーブルBを「以上(大なりイコール)」の条件でポジショナルグルーピング(昇順、取得件数=1)し、その後、S1302以降を繰り返す。
<JOIN処理の動作例>
図32は、本実施の形態に係るデータ処理であるJOIN処理の動作例を示している。図29の例では、テーブルAには、1(A1),2(A2),4(A4),5(A5),6(A6)のデータが格納され、テーブルBには、2(B2),3(B3),6(B6)のデータが格納されている。なお、説明の簡略化のため、各テーブルに各値のデータが一つしか含まれていないが、同値のデータが複数ある場合は、グルーピング動作により同値のデータが同時検出される。
図32(a)に示すように、FullOuter-JOINの場合、テーブルAとテーブルBのJoinカラムを同一位置に配置し、全体を対象に基本グルーピングを行う。FullOuter-JOINの結果は、JOIN個数=6、JOINデータ=(A1)、(A2,B2)、(B3)、(A4)、(A5)、(A6,B6)となる。
図32(b)に示すように、LeftOuter-JOINの場合、テーブルAでまず基本グルーピングを行い、テーブルAのグルーピング結果を使って、テーブルBを同値検索する。LeftOuter-JOINの結果は、JOIN個数=5、JOINデータ=(A1)、(A2,B2)、(A4)、(A5)、(A6,B6)となる。
図32(c)に示すように、RightOuter-JOINの場合、テーブルBでまず基本グルーピングを行い、テーブルBのグルーピング結果を使って、テーブルAを同値検索する。RightOuter-JOINの結果は、JOIN個数=3、JOINデータ=(A2,B2)、(B3)、(A6,B6)となる。
図32(d)に示すように、Inner-JOINの場合、テーブルAとテーブルBでポジショナルグルーピングを行い、同値がある箇所のみ結果を出力する。
まず、テーブルAとテーブルBを各々基本グルーピングし、テーブルAの結果が1、テーブルBの結果が2となる(S1401)。次に、S1401の結果ではテーブルAの値(1)の方が小さいため、テーブルBの値(2)以上でテーブルAをポジショナルグルーピングすると、テーブルAの結果が2となる(S1402)。
次に、S1402の結果ではテーブルAとテーブルBに同じ値(2)が現れるため、グルーピング結果(A2,B2)を出力し、さらに両テーブルを各々基本グルーピングする(S1403)。次に、S1403の結果ではテーブルBの値(3)の方が小さいため、テーブルAの値(4)以上でテーブルBをポジショナルグルーピングすると、テーブルBの結果が6となる(S1404)。
次に、S1404の結果ではテーブルAの値(4)の方が小さいため、テーブルBの値(6)以上でテーブルAをポジショナルグルーピングすると、テーブルAの結果が6となる(S1405)。次に、S1405の結果ではテーブルAとテーブルBに同じ値(6)が現れるため、グルーピング結果(A6、B6)を出力し、さらに両テーブルを各々基本グルーピングする(S1406)。S1406で新たなグルーピングデータ無しとなり処理を終了する(S1407)。
<本実施の形態の効果>
通常、JOIN処理を高速に行うためにはインデックスの作成を避けては通れない。しかしながら、一般に使われるB-Treeやハッシュインデックスの作成や更新は、序列(SORT順)の維持や、生成されるハッシュ値の変化による格納位置の変更などの処理を伴うため、生成や更新の処理負荷が大きい。一方、本実施の形態に係るJOIN処理では、上記実施の形態におけるグルーピング処理を使用することで、インデックスの作成を前提とせずに、任意のデータ集合をJOINすることができ、効率よくJOIN処理を行うことができる。
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
上述の実施形態における各構成は、ハードウェア又はソフトウェア、もしくはその両方によって構成され、1つのハードウェア又はソフトウェアから構成してもよいし、複数のハードウェア又はソフトウェアから構成してもよい。各装置の機能(処理)を、CPUやメモリ等を有するコンピュータにより実現してもよい。例えば、記憶装置に実施形態における方法を行うためのプログラムを格納し、各機能を、記憶装置に格納されたプログラムをCPUで実行することにより実現してもよい。
これらのプログラムは、コンピュータに読み込まれた場合に、実施形態で説明された1又はそれ以上の機能をコンピュータに行わせるための命令群(又はソフトウェアコード)を含む。プログラムは、非一時的なコンピュータ可読媒体又は実体のある記憶媒体に格納されてもよい。限定ではなく例として、コンピュータ可読媒体又は実体のある記憶媒体は、random-access memory(RAM)、read-only memory(ROM)、フラッシュメモリ、solid-state drive(SSD)又はその他のメモリ技術、CD-ROM、digital versatile disc(DVD)、Blu-ray(登録商標)ディスク又はその他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージ又はその他の磁気ストレージデバイスを含む。プログラムは、一時的なコンピュータ可読媒体又は通信媒体上で送信されてもよい。限定ではなく例として、一時的なコンピュータ可読媒体又は通信媒体は、電気的、光学的、音響的、またはその他の形式の伝搬信号を含む。