JP2014130489A - データ格納プログラム、データ検索プログラム、データ検索装置、データ格納方法及びデータ検索方法 - Google Patents

データ格納プログラム、データ検索プログラム、データ検索装置、データ格納方法及びデータ検索方法 Download PDF

Info

Publication number
JP2014130489A
JP2014130489A JP2012288075A JP2012288075A JP2014130489A JP 2014130489 A JP2014130489 A JP 2014130489A JP 2012288075 A JP2012288075 A JP 2012288075A JP 2012288075 A JP2012288075 A JP 2012288075A JP 2014130489 A JP2014130489 A JP 2014130489A
Authority
JP
Japan
Prior art keywords
hash
data
value
data set
key
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2012288075A
Other languages
English (en)
Other versions
JP6028567B2 (ja
Inventor
Ikuya Kobayashi
郁弥 小林
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2012288075A priority Critical patent/JP6028567B2/ja
Priority to US14/057,784 priority patent/US9235651B2/en
Priority to EP13190257.9A priority patent/EP2750053B1/en
Priority to CN201310739206.1A priority patent/CN103914506B/zh
Publication of JP2014130489A publication Critical patent/JP2014130489A/ja
Application granted granted Critical
Publication of JP6028567B2 publication Critical patent/JP6028567B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9014Indexing; Data structures therefor; Storage structures hash tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2255Hash tables

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Storage Device Security (AREA)

Abstract

【課題】データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させる。
【解決手段】データセットを複数のデータセットに分割し、各データセットのハッシュ関数を決定し、各ハッシュ関数を特定するハッシュ係数値情報及びハッシュ係数値とデータセットの対応情報を作成し、各データセットのハッシュ情報22を作成する処理をコンピュータに実行させるプログラムで、ハッシュ関数決定処理において、データセット毎に、データセットの各データのキーに基づいて候補ハッシュ関数でハッシュ値を求め、これに基づく第1番地又はこれに連続する第2番地に全データを格納できると判定したデータセットのハッシュ関数として候補ハッシュ関数を決定し、ハッシュ情報作成処理において、データセット毎に、第1又は第2番地にデータ及びキーを格納してデータセットに対するハッシュ情報を作成する。
【選択図】図1

Description

本発明は、データ格納プログラム、データ検索プログラム、データ検索装置、データ格納方法及びデータ検索方法に関する。
従来、データ検索方法の一つとして、ハッシュテーブルを用いたデータ検索方法がある。
ここで、ハッシュテーブルとは、テーブルにデータの格納する位置を決定する手段として、また、テーブルからデータを取得する位置を決定する手段として、ハッシュ関数を用いるテーブル型データ構造の一種である。
このハッシュテーブルを用いたデータ検索方法は、他のデータ検索方法(例えば二分木探索法)と比較して、データ検索効率が高い、即ち、検索対象データを発見する又はそれが存在しないと判断するまでに要する時間が短いという利点がある。
一方、ハッシュテーブルを用いたデータ検索方法は、ハッシュ関数によって求められたハッシュ値に基づいて特定される格納位置にデータを格納して作成されたハッシュテーブルを用いる。このハッシュ関数によって求められるハッシュ値が、異なるデータで同一になる場合があり、この場合に、これらのデータをハッシュテーブルにどのように格納し、検索するかによって、データ検索効率が低下することになる。
これに対し、ハッシュテーブルに格納する全てのデータの間でハッシュ値が重複しないことを保証する完全ハッシュ関数を用いることが考えられる。完全ハッシュ関数を用いて作成されたハッシュテーブルを用いる場合、異なるデータの間で格納位置が重複することがないため、データ検索時に格納位置を一意に特定することができ、理論上、データ検索効率が最も高くなり、最良のデータ検索効率が保証される。
しかしながら、所与のデータセットに対する完全ハッシュ関数を求めることは容易ではない。特に、大規模データセットに対する完全ハッシュ関数を求めることは容易ではない。例えば、総当り方式(ブルートフォース方式)で完全ハッシュ関数を算出する場合の算出コストはデータ数の増加に対して指数関数的に増大する。
これに対し、完全ハッシュ関数を算出する場合の算出コストを抑える方法として、大規模データセットを複数の小規模データセットに分割し、複数の小規模データセットのそれぞれに対して個別の完全ハッシュ関数を算出するCHDアルゴリズムがある。
D. Belazzougui, F. C. Botelho, M. Dietzfelbinger, "Hash, Displace, and Compress", Lecture Notes in Computer Science Volume 5757, 2009, pp.682-693
ところで、上述のCHDアルゴリズムでは、複数の小規模データセットのそれぞれに対応する個別の完全ハッシュ関数として、2つのハッシュ関数f1(x)、f2(x)と2つの作用素α、βによって規定される完全ハッシュ関数、即ち、式x=f1(x)+αf2(x)+βを決め、これを用いてハッシュ値xを算出する。そして、この完全ハッシュ関数によって求められたハッシュ値に基づいてデータを格納してハッシュテーブルを作成することになる。しかしながら、この完全ハッシュ関数の決定、ハッシュ値の算出及びハッシュテーブルの作成には時間がかかる。このため、データの格納に時間がかかり、データ格納速度が遅くなる。
また、上述のCHDアルゴリズムでは、複数の小規模データセットのそれぞれに対応する個別の完全ハッシュ関数の作用素α、βをそれぞれ圧縮して保持し、データ検索時に圧縮された各作用素α、βを伸長して元の作用素とする。そして、この元の作用素を用いて上述の完全ハッシュ関数によってハッシュ値を算出し、算出されたハッシュ値を用いてデータを検索することになる。しかしながら、このハッシュ値の算出には時間がかかる。このため、データの検索に時間がかかり、データ検索速度が遅くなる。
そこで、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることを目的とする。
本データ格納プログラムは、コンピュータに、データセットを複数のデータセットに分割し、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応情報を作成し、複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行させ、複数のハッシュ関数を決定する処理において、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第1格納位置又は第1格納位置に連続する第2格納位置に複数のデータの全てを格納することができるか否かを判定し、第1格納位置又は第2格納位置に複数のデータの全てを格納することができると判定したデータセットに対するハッシュ関数として候補ハッシュ関数を決定する、処理をコンピュータに実行させ、複数のハッシュ情報を作成する処理において、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第1格納位置又は第2格納位置にデータ及びキーを格納してデータセットに対するハッシュ情報を作成する処理をコンピュータに実行させることを要件とする。
本データ検索プログラムは、コンピュータに、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算し、一のハッシュ情報から、ハッシュ値に基づいて特定される第1格納位置及び第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出し、第1格納位置又は第2格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する、処理を実行させることを要件とする。
本データ検索装置は、データセットを複数のデータセットに分割するデータ分割部と、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定するハッシュ関数決定部と、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成するハッシュ係数値情報作成部と、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応情報を作成する対応情報作成部と、複数のデータセットのそれぞれに対する複数のハッシュ情報を作成するハッシュ情報作成部とを備え、ハッシュ関数決定部は、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第1格納位置又は第1格納位置に連続する第2格納位置に複数のデータの全てを格納することができるか否かを判定し、第1格納位置又は第2格納位置に複数のデータの全てを格納することができると判定したデータセットに対するハッシュ関数として候補ハッシュ関数を決定し、ハッシュ情報作成部は、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第1格納位置又は第2格納位置にデータ及びキーを格納してデータセットに対するハッシュ情報を作成することを要件とする。
本データ検索装置は、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定するハッシュ情報特定部と、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得するハッシュ係数値取得部と、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算するハッシュ値計算部と、一のハッシュ情報から、ハッシュ値に基づいて特定される第1格納位置及び第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出す読出部と、第1格納位置又は第2格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する出力部とを備えることを要件とする。
本データ格納方法は、コンピュータが、データセットを複数のデータセットに分割し、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応情報を作成し、複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行し、複数のハッシュ関数を決定する処理において、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第1格納位置又は第1格納位置に連続する第2格納位置に複数のデータの全てを格納することができるか否かを判定し、第1格納位置又は第2格納位置に複数のデータの全てを格納することができると判定した前記データセットに対するハッシュ関数として候補ハッシュ関数を決定する、処理をコンピュータが実行し、複数のハッシュ情報を作成する処理において、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第1格納位置又は第2格納位置にデータ及びキーを格納してデータセットに対するハッシュ情報を作成する処理をコンピュータが実行することを要件とする。
本データ検索方法は、コンピュータが、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算し、一のハッシュ情報から、ハッシュ値に基づいて特定される第1格納位置及び第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出し、第1格納位置又は第2格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する、処理を実行することを要件とする。
したがって、本データ格納プログラム、データ検索プログラム、データ検索装置、データ格納方法及びデータ検索方法によれば、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることができるという利点がある。
本実施形態にかかるデータ検索装置の構成を示す図である。 本実施形態にかかるデータ検索装置を備える情報処理装置のハードウェア構成を示す図である。 本実施形態にかかるデータ検索装置に備えられるデータ格納処理部(データ格納プログラム)による処理(データ格納方法)を示すフローチャートである。 本実施形態にかかるデータ検索装置に備えられるデータ格納処理部(データ格納プログラム)による処理(データ格納方法)を示すフローチャートである。 本実施形態にかかるデータ検索装置に備えられるデータ格納処理部(データ格納プログラム)による処理(データ格納方法)を示すフローチャートである。 本実施形態にかかるデータ検索装置に備えられるハッシュ関数インデックス表(対応表)及びハッシュ関数実体管理表(ハッシュ係数値表)を示す模式図である。 本実施形態にかかるデータ検索装置に備えられるデータ格納処理部(データ格納プログラム)による処理(データ格納方法)を示すフローチャートである。 本実施形態にかかるデータ検索装置に備えられるデータ格納処理部(データ格納プログラム)による処理(データ格納方法)を示すフローチャートである。 本実施形態にかかるデータ検索装置に備えられるデータ検索処理部(データ検索プログラム)による処理(データ検索方法)を示すフローチャートである。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおける格納対象のデータセットを示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおける格納対象のデータセットにおける各データのCRC32値及びCRC32値を「5」(小規模データセットの数)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおける格納対象のデータセットを複数の小規模データセットに分割した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおける各小規模データセットにするハッシュ関数の割り当て結果を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるハッシュ関数実体管理表(ハッシュ係数値表)を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるハッシュ関数インデックス表(対応表)を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「0」に含まれる各データのハッシュ値を「5」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「0」に含まれる各データを、データセット番号「0」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「1」に含まれる各データのハッシュ値を「5」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「1」に含まれる各データを、データセット番号「1」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「2」に含まれる各データのハッシュ値を「5」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「2」に含まれる各データを、データセット番号「2」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「3」に含まれる各データのハッシュ値を「5」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「3」に含まれる各データを、データセット番号「3」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「4」に含まれる各データのハッシュ値を「5」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータセット番号「4」に含まれる各データを、データセット番号「4」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した従業員ID検索システムにおけるデータ検索処理部(データ検索プログラム)による処理(データ検索方法)を示すフローチャートである。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおける格納対象のデータセットを示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおける格納対象のデータセットにおける各データのCRC32値及びCRC32値を「4」(小規模データセットの数)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおける格納対象のデータセットを複数の小規模データセットに分割した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおける各小規模データセットにするハッシュ関数の割り当て結果を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるハッシュ関数実体管理表(ハッシュ係数値表)を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるハッシュ関数インデックス表(対応表)を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「0」に含まれる各データのハッシュ値を「4」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「0」に含まれる各データを、データセット番号「0」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「1」に含まれる各データのハッシュ値を「5」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「1」に含まれる各データを、データセット番号「1」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「2」に含まれる各データのハッシュ値を「4」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「2」に含まれる各データを、データセット番号「2」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「3」に含まれる各データのハッシュ値を「5」(ハッシュテーブルのサイズ)で割った余りの値を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータセット番号「3」に含まれる各データを、データセット番号「3」に対応するハッシュテーブルに格納した結果を示す図である。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータ検索処理部(データ検索プログラム)による処理(データ検索方法)を示すフローチャートである。 本実施形態にかかるデータ検索装置を適用した辞書式データ圧縮システムにおけるデータ検索処理部(データ検索プログラム)による処理(データ検索方法)を含むデータ圧縮処理を示すフローチャートである。
以下、図面により、本発明の実施の形態にかかるデータ格納プログラム、データ検索プログラム、データ検索装置、データ格納方法及びデータ検索方法について、図1〜図42を参照しながら説明する。
本実施形態にかかるデータ検索装置は、例えばサーバなどの情報処理装置に備えられ、データの格納及び検索を行なうのに用いられるものである。
まず、本データ検索装置を備える情報処理装置のハードウェア構成について、図2を参照しながら説明する。
本データ検索装置を備える情報処理装置は、例えばサーバなどのコンピュータを用いて実現することができ、そのハードウェア構成は、例えば図2に示すように、CPU(Central Processing Unit)102、メインメモリ101、通信制御部109、入力装置106、表示制御部103、表示装置104、記憶装置105、可搬型記録媒体108のドライブ装置107を備え、これらがバス110によって相互に接続された構成になっている。なお、本装置のハードウェア構成はこれに限られるものではない。
ここで、CPU102は、コンピュータ全体を制御するものであり、プログラムをメインメモリ101に読み出して実行し、データ検索装置を備える情報処理装置に必要な処理を行なうものである。また、CPU102は、その内部にメインメモリ101よりも小容量で高速アクセス可能なキャッシュメモリ111を含む。このキャッシュメモリ111としては、例えばSRAMが用いられる。キャッシュメモリ111は、プログラムの実行等を行なう際に、頻繁にアクセスするデータを一時的に格納しておくものである。これをCPUキャッシュ又はCPUキャッシュメモリともいう。
メインメモリ101は、プログラムの実行等を行なう際に、プログラム又はデータを一時的に格納しておくものである。このメインメモリ101としては、例えばDRAMが用いられる。
通信制御部109(通信インターフェース)は、例えばLANやインターネットなどのネットワークを介して、他の装置と通信するために用いられるものである。この通信制御部109は、コンピュータに元から組み込まれていても良いし、後からコンピュータに取り付けられたNIC(Network Interface Card)でも良い。
入力装置106は、例えばマウスなどのポインティングデバイスやキーボードである。
表示装置104は、例えば液晶ディスプレイなどの表示装置である。
表示制御部103は、例えば分析結果などを表示装置104に表示させるための制御を行なうものである。
なお、これらの入力装置106や表示装置104は、ネットワークに接続された別のコンピュータに備えられている入力装置や出力装置であっても良い。
記憶装置105は、例えばハードディスクドライブ(HDD)であり、各種のプログラム及び各種のデータが格納されている。本実施形態では、記憶装置105には、後述のデータ格納プログラムやデータ検索プログラムが格納されており、また、後述の大規模データセットが格納されている。なお、この記憶装置105のほかに例えばROM(Read Only Memory)を備えるものとし、これに各種のプログラムや各種のデータを格納しておいても良い。
ドライブ装置107は、例えば光ディスクや光磁気ディスク等の可搬型記録媒体108の記憶内容にアクセスするためのものである。
このようなハードウェア構成を備えるコンピュータにおいて、CPU102が、例えば記憶装置105に格納されているデータ格納プログラムやデータ検索プログラムをメインメモリ101に読み出して実行することで、本データ検索装置の各機能、即ち、データ格納処理機能、データ検索処理機能、ハッシュ係数値表記憶機能、対応表記憶機能、ハッシュテーブル記憶機能という各機能が実現される。
このため、図1に示すように、本データ検索装置1は、データ格納処理部2と、データ検索処理部3と、ハッシュ係数値表記憶部4と、対応表記憶部5と、ハッシュテーブル記憶部6とを備える。
ここで、データ格納処理部2は、データ分割部7と、ハッシュ関数決定部8と、ハッシュ係数値表作成部9と、対応表作成部10と、ハッシュテーブル作成部11とを備える。
このうち、データ分割部7は、データセットを複数のデータセットに分割する。
ハッシュ関数決定部8は、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定する。特に、ハッシュ関数決定部8は、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第1格納位置又は第1格納位置に連続する第2格納位置に複数のデータの全てを格納することができるか否かを判定し、第1格納位置又は第2格納位置に複数のデータの全てを格納することができると判定したデータセットに対するハッシュ関数として候補ハッシュ関数を決定する。ここで、ハッシュ関数決定部8は、データのキー列(キー文字列){x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれるハッシュ関数を候補ハッシュ関数として用いるのが好ましい。また、ハッシュ関数決定部8は、第1格納位置又は第2格納位置に複数のデータの全てを格納することができると判定したデータセットが2つ以上ある場合に、候補ハッシュ関数を2つ以上のデータセットのそれぞれに対するハッシュ関数として決定するのが好ましい。また、ハッシュ関数決定部8は、複数のデータセットのそれぞれに対する複数のハッシュ関数として16個又は32個のハッシュ関数を決定するのが好ましい。
ハッシュ係数値表作成部9は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表20(図6参照)を作成する。ここでは、ハッシュ係数値表作成部9は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値をCPUキャッシュメモリ111上に格納して、CPUキャッシュメモリ111上にハッシュ係数値表20(図6参照)を作成する。これにより、CPUキャッシュメモリ111上にハッシュ係数値表20(図6参照)が保持され、CPUキャッシュメモリ111上にハッシュ係数値表20(図6参照)を記憶するハッシュ係数値表記憶部4が作成される。このように、ハッシュ係数値表作成部9は、CPUキャッシュメモリ111上に保持しうる情報量のハッシュ係数値表20(図6参照)を作成するのが好ましい。なお、ハッシュ係数の値は、ハッシュ関数の実体(entity)であるため、ハッシュ係数値表20(図6参照)を、ハッシュ関数実体管理表又はハッシュ係数値情報ともいう。また、ハッシュ係数値表作成部9を、ハッシュ関数実体管理表作成部又はハッシュ係数値情報作成部ともいう。
対応表作成部10は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表21(図6参照)を作成する。ここでは、対応表作成部10は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表21(図6参照)をCPUキャッシュメモリ111上に格納して、CPUキャッシュメモリ111上に対応表21(図6参照)を作成する。これにより、CPUキャッシュメモリ111上に対応表21(図6参照)が保持され、CPUキャッシュメモリ111上に対応表21(図6参照)を記憶する対応表記憶部5が作成される。このように、対応表作成部10は、CPUキャッシュメモリ111上に保持しうる情報量の対応表21(図6参照)を作成するのが好ましい。また、対応表作成部10は、候補ハッシュ関数を2つ以上のデータセットのそれぞれに対するハッシュ関数として決定する場合、一つのハッシュ関数を特定するハッシュ係数の値と2つ以上のデータセットとを対応づけている対応表を作成するのが好ましい。また、対応表作成部10は、複数のデータセットのそれぞれに対する複数のハッシュ関数として16個又は32個のハッシュ関数を決定する場合、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づけ、かつ、4ビット又は5ビットで構成されている複数のインデックスを含む対応表を作成するのが好ましい。なお、対応表21(図6参照)を、ハッシュ関数インデックス表又は対応情報ともいう。また、対応表作成部10を、ハッシュ関数インデックス表作成部又は対応情報作成部ともいう。
ハッシュテーブル作成部11は、複数のデータセットのそれぞれに対する複数のハッシュテーブル22を作成する。特に、ハッシュテーブル作成部11は、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第1格納位置又は第2格納位置にデータ及びキーを格納してデータセットに対するハッシュテーブル22を作成する。なお、ハッシュテーブル22を、ハッシュ情報ともいう。また、ハッシュテーブル作成部11を、ハッシュ情報作成部ともいう。
データ検索処理部3は、ハッシュテーブル特定部12と、ハッシュ係数値取得部13と、ハッシュ値計算部14と、読出部15と、出力部16とを備える。
このうち、ハッシュテーブル特定部12は、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュテーブル22の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュテーブル22を特定する。なお、ハッシュテーブル特定部12を、ハッシュ情報特定部ともいう。
ハッシュ係数値取得部13は、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応表21(図6参照)及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表20(図6参照)を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得する。この場合、対応表21及びハッシュ係数値表20(図6参照)は、CPUキャッシュメモリ111上に保持しうる情報量になっていることが好ましい。また、対応表は、一つのハッシュ関数を特定するハッシュ係数の値と2つ以上のデータセットとを対応づけているものであることが好ましい。また、対応表は、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける複数のインデックスを含み、複数のインデックスは、それぞれ、4ビット又は5ビットで構成されていることが好ましい。また、複数のハッシュ関数は、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれるものであることが好ましい。また、複数のハッシュ関数は、16個又は32個のハッシュ関数であることが好ましい。
ハッシュ値計算部14は、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算する。
読出部15は、一のハッシュテーブル22から、ハッシュ値に基づいて特定される第1格納位置及び第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出す。
出力部16は、第1格納位置又は第2格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する。
ハッシュ係数値表記憶部4は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表20(図6参照)を記憶する。つまり、ハッシュ係数値表記憶部4は、上述のハッシュ係数値表作成部9によって作成されるハッシュ係数値表20(図6参照)を記憶する。なお、ハッシュ係数の値は、ハッシュ関数の実体であるため、ハッシュ係数値表記憶部4を、ハッシュ関数実体管理表記憶部ともいう。また、ハッシュ係数値表記憶部4を、ハッシュ係数値情報記憶部ともいう。本実施形態では、CPUキャッシュメモリ111の記憶領域の一部がハッシュ係数値表記憶部4として使用される。つまり、上述のハッシュ係数値表作成部9によって作成されるハッシュ係数値表20(図6参照)は、CPUキャッシュメモリ111上に保持される。
対応表記憶部5は、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表21(図6参照)を記憶する。つまり、対応表記憶部5は、上述の対応表作成部10によって作成される対応表21(図6参照)を記憶する。なお、対応表記憶部5を、ハッシュ関数インデックス表記憶部又は対応情報記憶部ともいう。本実施形態では、CPUキャッシュメモリ111の記憶領域の一部が対応表記憶部5として使用される。つまり、上述の対応表作成部10によって作成される対応表21(図6参照)は、CPUキャッシュメモリ111上に保持される。
ハッシュテーブル記憶部6は、複数のデータセットのそれぞれに対する複数のハッシュテーブル22(ハッシュテーブルセット)を記憶する。つまり、ハッシュテーブル記憶部6は、上述のハッシュテーブル作成部11によって作成された複数のハッシュテーブル22を記憶する。なお、ハッシュテーブル記憶部6を、ハッシュ情報記憶部ともいう。本実施形態では、メインメモリ101の記憶領域の一部がハッシュテーブル記憶部6として使用される。つまり、上述のハッシュテーブル作成部11によって作成された複数のハッシュテーブル22は、メインメモリ101上に保持される。
次に、本データ検索装置においてCPU102がメインメモリ101に読み込まれたデータ格納プログラムやデータ検索プログラムに従って実行する処理(データ格納方法;データ検索方法)について、図3〜図9を参照しながら説明する。
まず、本データ検索装置に備えられるデータ格納処理部2による処理、即ち、本データ検索装置1においてCPU102がメインメモリ101に読み込まれたデータ格納プログラムに従って実行する処理(データ格納方法)について、図3〜図8を参照しながら説明する。
ここでは、データ格納処理部2は、データセットの格納依頼を受けると、以下の手順で、データセットを、メインメモリ101上に作成されるハッシュテーブル(ハッシュ情報)22に格納する。
まず、データ格納処理部2は、格納対象のデータセットを受けとったら、図3に示すように、データ分割部7によって、格納対象のデータセットを複数のデータセットに分割する(ステップS10)。
ここでは、データ格納処理部2は、データ分割部7によって、格納対象の大規模データセットを、複数の小規模データセットに分割する。例えば、大規模データセットを構成する複数のデータを、各小規模データセットが平均4つのデータを含むように、複数の小規模データセットに分割する。この場合、格納する大規模データセットを構成するデータの合計数がnの場合、小規模データセットの数mを例えばROUND(n÷4)で決定すれば良い。具体的には、格納対象の大規模データセットを構成する複数のデータのそれぞれのキーのCRC32値を計算し、算出された各CRC32値を小規模データセットの数mで割った余りの値(CRC値)を算出する。そして、算出されたCRC値が同じデータが同じ小規模データセットに含まれるように、n個のデータを含む大規模データセットをm個の小規模データセットに分割する。つまり、算出されたCRC値を、m個の小規模データセットの識別番号(データセット番号)として用い、n個のデータを含む大規模データセットをm個の小規模データセットに分割する。例えば、SSE4.2拡張命令セットをサポートするCPUを用いる場合、ハードウェア的に組み込まれたCRC32c演算命令(組み込み関数名:crc32)を用いて高速に大規模データセットを複数の小規模データセットに分割することができる。
次に、データ格納処理部2は、ハッシュ関数決定部8によって、複数のデータセットのそれぞれに対する複数のハッシュ関数を決定する(ステップS20)。つまり、複数のデータセットのそれぞれに対するハッシュテーブル22を作成するのに用いる複数のハッシュ関数を決定する。特に、データ格納処理部2は、ハッシュ関数決定部8によって、データセット毎に、データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、ハッシュ値に基づいて特定される第1格納位置又は第1格納位置に連続する第2格納位置に複数のデータの全てを格納することができるか否かを判定し、第1格納位置又は第2格納位置に複数のデータの全てを格納することができると判定したデータセットに対するハッシュ関数として候補ハッシュ関数を決定する。また、第1格納位置又は第2格納位置に複数のデータの全てを格納することができると判定したデータセットが2つ以上ある場合に、候補ハッシュ関数を2つ以上のデータセットのそれぞれに対するハッシュ関数として決定する。
次に、データ格納処理部2は、ハッシュ係数値表作成部9(ハッシュ関数実体管理表作成部;ハッシュ係数値情報作成部)によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表20(ハッシュ関数実体管理表;ハッシュ係数値情報;図6参照)を作成する(ステップS30)。ここでは、データ格納処理部2は、ハッシュ係数値表作成部9によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値をCPUキャッシュメモリ111上に格納して、CPUキャッシュメモリ111上にハッシュ係数値表20(図6参照)を作成する。これにより、CPUキャッシュメモリ111上にハッシュ係数値表20(図6参照)が保持され、CPUキャッシュメモリ111上にハッシュ係数値表20(図6参照)を記憶するハッシュ係数値表記憶部(ハッシュ係数値情報記憶部)4が作成される。このように、データ格納処理部2は、ハッシュ係数値表作成部9によって、CPUキャッシュメモリ111上に保持しうる情報量のハッシュ係数値表20(図6参照)を作成するのが好ましい。
次に、データ格納処理部2は、対応表作成部10(ハッシュ関数インデックス表作成部;対応情報作成部)によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表21(ハッシュ関数インデックス表;対応情報;図6参照)を作成する(ステップS40)。ここでは、データ格納処理部2は、対応表作成部10によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表21(図6参照)をCPUキャッシュメモリ111上に格納して、CPUキャッシュメモリ111上に対応表21(図6参照)を作成する。これにより、CPUキャッシュメモリ111上に対応表21(図6参照)が保持され、CPUキャッシュメモリ111上に対応表21(図6参照)を記憶する対応表記憶部(対応情報記憶部)5が作成される。このように、データ格納処理部2は、対応表作成部10によって、CPUキャッシュメモリ111上に保持しうる情報量の対応表21(図6参照)を作成するのが好ましい。また、データ格納処理部2は、候補ハッシュ関数を2つ以上のデータセットのそれぞれに対するハッシュ関数として決定する場合、対応表作成部10によって、一つのハッシュ関数を特定するハッシュ係数の値と2つ以上のデータセットとを対応づけている対応表を作成するのが好ましい。
ここでは、これらの複数のハッシュ関数を決定する処理(ステップS20)、ハッシュ係数値表を作成する処理(ステップS30)及び対応表を作成する処理(ステップS40)を並行して行なう場合であって、複数の小規模データセットに対して16個のハッシュ関数を割り当てる場合を例に挙げて、以下、図4を参照しながら、具体的に説明する。
なお、ここでは、「i」を「1」から「16」まで1つずつインクリメントしていくことで(1≦i≦16)、インデックス番号1〜16のそれぞれに対応する16個のハッシュ関数を決定する。
まず、図4に示すように、データ格納処理部2は、ハッシュ関数決定部8によって、「i」を「1」(i=1)とし(ステップA10)、候補ハッシュ関数として、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数を選出する(ステップA20)。例えば、ハッシュ係数Rの値を「1」として1つのハッシュ関数を選出し、これを候補ハッシュ関数とすれば良い。
次に、データ格納処理部2は、ハッシュ関数決定部8によって、選出した候補ハッシュ関数によって、小規模データセット毎に、それに含まれる複数のデータのそれぞれのキーに基づいてハッシュ値を算出する(ステップA30)。ここでは、データ格納処理部2は、ハッシュ関数決定部8によって、m個の小規模データセットの識別番号(データセット番号)の番号順に、各小規模データセットについて、選出した候補ハッシュ関数によって、それに含まれる複数のデータのそれぞれのキーに基づいてハッシュ値を算出する。
例えば、上述のように、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数を候補ハッシュ関数として選出する場合、上記の式を次の積和式に展開して、ハッシュ値を計算すれば良い。
Figure 2014130489
このように、関数族から候補ハッシュ関数を選出することで、候補ハッシュ関数の選出が簡便となり、高速化を図ることが可能となる。また、上述のように再帰関数を非再帰関数に変換することで、例えばマルチプロセッサ並列処理やCPU命令プリフェッチを用いて、ハッシュ値の計算を高速化することが可能である。また、積和演算又はベクトル演算の計算機能を備えたCPUを用いて(例えばCPUのSIMD命令を用いて)、その計算機能によって上述の積和式の計算を行なうことで、あるいは、並列計算(同時並列計算)が可能なCPU(例えばマルチコアCPU、即ち、単一のCPUデバイスが複数のCPUユニットを持つもの)や複数のCPUを用いて、上述の積和式の並列計算を行なうことで、ハッシュ値の計算を高速に行なうことが可能となる。また、単一のハッシュ関数f(x)によってハッシュ値を計算するため、f1(x)+αf2(x)+βで表される完全ハッシュ関数によってハッシュ値を計算する、即ち、2つのハッシュ関数f1(x)、f2(x)の計算を必要とする、上述のCHDアルゴリズムと比較して、ハッシュ値の計算を高速に行なうことができる。これにより、データの格納処理を高速に行なうことが可能になる。
次いで、データ格納処理部2は、ハッシュ関数決定部8によって、小規模データセット毎に、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はこれに連続する格納位置(第2格納位置)に複数のデータの全てを格納することができるか否かを判定する(ステップA40)。ここでは、データ格納処理部2は、ハッシュ関数決定部8によって、m個の小規模データセットの識別番号(データセット番号)の番号順に、各小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はこれに連続する格納位置(第2格納位置)に複数のデータの全てを格納することができるか否かを判定する。
以下、各小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納することができるか否かを判定する場合を例に挙げて、図5を参照しながら説明する。
例えば、データ格納処理部2は、ハッシュ関数決定部8によって、まず、選出した候補ハッシュ関数によって1番目の小規模データセットに含まれる1つ目のデータのキーに基づいて算出したハッシュ値を、1番目の小規模データセットに対するハッシュテーブルのサイズで割った余りの値を算出し(ステップB10)、この余りの値に相当する仮格納用ハッシュテーブルの番地(行;格納位置)に1つ目のデータを格納する(ステップB20)。ここで、1番目の小規模データセットに含まれるデータの数n′が「4」の場合、1番目の小規模データセットに対するハッシュテーブルのサイズを例えばROUND(n′÷0.8)で「5」にすれば良い。なお、ハッシュテーブルのサイズが「5」とは、5つのデータを格納しうるハッシュテーブルであることを意味する。次に、選出した候補ハッシュ関数によって、1番目の小規模データセットに含まれる2つ目のデータのキーに基づいて算出したハッシュ値を、1番目の小規模データセットに対するハッシュテーブルのサイズで割った余りの値を算出し(ステップB10)、この余りの値に相当する仮格納用テーブルの番地に2つ目のデータを格納する(ステップB20)。以後、同様の処理を、1番目の小規模データセットに含まれる複数のデータの全てに対して行なう。これにより、1番目の小規模データセットに対する仮格納用テーブルが作成される。
次に、このようにして作成された1番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されているデータの数が3つ以上であるかを判定する(ステップB30)。
この判定の結果、この条件を満たしていないと判定した場合、NOルートへ進み、(i)1番目の小規模データセットに対する仮格納用テーブルの次の番地に格納されているデータの数が3つ以上であるか、(ii)次の番地に格納されているデータが2つで、かつ、最初の番地に格納されているデータが2つであるか、を判定する(ステップB40)。
この判定の結果、これらの(i),(ii)の2つの条件をいずれも満たしていないと判定した場合、NOルートへ進み、1番目の小規模データセットに対する仮格納用テーブルのそれ以降の番地に格納されているデータについて、順番に、(iii)その番地に格納されているデータの数が3つ以上であるか、(iv)その番地に格納されているデータが2つで、かつ、その直前の番地に格納されているデータが2つであるか、(v)その番地に格納されているデータが2つで、かつ、その番地が最後の番地であるか、(vi)その番地に格納されているデータが1つで、かつ、その番地が最後の番地で、かつ、その直前の番地に格納されているデータが2つであるか、を判定する(ステップB50)。
この判定の結果、1番目の小規模データセットに対する仮格納用テーブルのそれ以降の全ての番地に格納されているデータについて、これらの(iii)〜(vi)の4つの条件をいずれも満たしていないと判定した場合、NOルートへ進み、1番目の小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納することができると判定する(ステップB60)。この場合、図4のフローチャートのステップA40における判定の結果、YESルートへ進むことになる。
一方、1番目の小規模データセットに対する仮格納用テーブルのいずれかの番地に格納されているテータについて、上述のいずれかの条件を満たしていると判定した場合、即ち、ステップB30、B40、B50のいずれかで条件を満たしていると判定した場合、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地又は次の番地に全てのデータを格納することができないため、1番目の小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納することができないと判定する(ステップB70)。この場合、図4のフローチャートのステップA40における判定の結果、NOルートへ進むことになる。
なお、ここでは、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納することができるか否かを判定する場合を例に挙げて説明しているが、これに限られるものではなく、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はこれに連続する格納位置(第2格納位置)に複数のデータの全てを格納することができるか否かを判定すれば良い。例えば、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又はこの後の複数番地(第2格納位置)に複数のデータの全てを格納することができるか否かを判定しても良い。ここで、第1格納位置としての番地からいくつ後の番地までを第2格納位置とするかは、データ検索処理時に、使用するCPUにおいて、1回のロード命令の実行によってロード可能なデータサイズに応じて決めれば良い。例えば、使用するCPUにおいて、各番地のデータとキーの合計サイズをdとし、1回のロード命令(例えば、汎用レジスタに対する汎用ロード命令、又は、XMMレジスタやYMMレジスタなどのSIMD命令用レジスタに対応するSIMDロード命令)の実行によって、CPUのレジスタにロード可能なデータサイズの最大値をDとし、y番地後までを第2格納位置とする場合、yを0≦y≦FLOOR(D÷d)の範囲から決定すれば良い。また、例えば、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はその前の格納位置(第2格納位置)に複数のデータの全てを格納することができるか否かを判定しても良い。
また、上述のように、小規模データセットについて、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される第1格納位置又はこれに連続する第2格納位置に複数のデータの全てを格納することができるか否かの判定は、候補ハッシュ関数が、小規模データセット、又は、小規模データセットに含まれる複数のデータを格納するハッシュテーブルに対して、準完全ハッシュ関数であるか否かの判定である。ここで、小規模データセットに含まれる複数のデータの全てについて、ハッシュテーブル上での実際のデータの格納位置が、あるハッシュ関数によって算出されるハッシュ値に基づいて特定される第1格納位置又はこれに連続する第2格納位置であるという条件を満たす場合、そのハッシュ関数を準完全ハッシュ関数という。また、候補ハッシュ関数が小規模データセットに対して準完全ハッシュ関数であるかの判定によって準完全ハッシュ関数として選出される確率は、上述のCHDアルゴリズムのようにあるハッシュ関数が小規模データセットに対して完全ハッシュ関数であるかの判定によって完全ハッシュ関数として選出される確率よりも高い。つまり、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される第1格納位置又はこれに連続する第2格納位置にデータを格納することができるか否かを判定してハッシュ関数を選出することで、完全ハッシュ関数を選出する場合よりもハッシュ関数の選出条件を緩めることで、ハッシュ関数の選出を容易に、かつ、高速に行なうことができるようにしている。このため、各小規模データセットに対するハッシュ関数の決定を高速に行なうことが可能となる。
ところで、図4のステップA40で、データ格納処理部2は、ハッシュ関数決定部8によって、小規模データセット毎に、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はこれに連続する格納位置(第2格納位置)に複数のデータの全てを格納することができると判定した場合、YESルートへ進み、その小規模データセットが条件を満たしていることを示すフラグF、即ち、候補ハッシュ関数がその小規模データセットに対して準完全ハッシュ関数であることを示すフラグFを「1」に設定し(F=1;ステップA50)、ステップA60へ進む。
一方、図4のステップA40で、データ格納処理部2は、ハッシュ関数決定部8によって、小規模データセット毎に、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はこれに連続する格納位置(第2格納位置)に複数のデータの全てを格納することができないと判定した場合、NOルートへ進み、ステップA60へ進む。この場合、フラグFは初期設定の「0」に設定されている。
そして、ステップA60で、ハッシュ関数が割り当てられていない全ての小規模データセットに対して、選出した候補ハッシュ関数によって、ハッシュ値を算出し、算出したハッシュ値に基づいて特定される番地(第1格納位置)又はこれに連続する番地(第2格納位置)に複数のデータの全てを格納することができるか否かを判定する、各処理を行なったか否かを判定する。
この段階では、ハッシュ関数が割り当てられている小規模データセットはなく、まだ1番目の小規模データセットに対する処理しか行なっていないため、ハッシュ関数が割り当てられていない全ての小規模データセットに対して各処理を行なっていないと判定し、NOルートへ進み、ステップA30へ戻って、2番目以降の小規模データセットに対して同様の処理(ステップA30〜A60、B10〜B70)を繰り返す。
そして、ステップA60で、ハッシュ関数が割り当てられていない全ての小規模データセットに対して各処理を行なったと判定した場合、YESルートへ進む。この場合、ハッシュ関数が割り当てられていない全ての小規模データセットについて、選出した候補ハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納することができるか否かの判定結果が得られている。
次に、データ格納処理部2は、ハッシュ関数決定部8によって、第1格納位置又は第2格納位置に複数のデータの全てを格納することができると判定した小規模データセットに対するハッシュ関数として候補ハッシュ関数を決定し、ハッシュ係数値表作成部9によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表20(図6参照)を作成し、対応表作成部10によって、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表21(図6参照)を作成する(ステップA70、A80)。
例えば、m個の小規模データセットのうち、候補ハッシュ関数によって算出したハッシュ値に基づいて特定される第1格納位置又は第2格納位置に全てのデータを格納することができると判定された小規模データセットがa個あった場合、m−aが閾値thd以下の場合に、候補ハッシュ関数をハッシュ関数として採用し、a個の小規模データセットのそれぞれに対するハッシュ関数として割り当てる。このように、小規模データセットの総数と条件を満たした小規模データセットの数との差が小さい場合、即ち、条件を満たした小規模データセットの数が多い場合に、ハッシュ関数として採用するようにしている。これにより、できるだけ多くの小規模データセットに対して一つのハッシュ関数が割り当てられるようにしている。
このため、ステップA70で、m−aが閾値thd以下であるか否かを判定し、この判定の結果、m−aが閾値thd以下であると判定した場合に、YESルートへ進んで、ステップA80へ進み、CPUキャッシュメモリ111上に作成したハッシュ係数値表、即ち、ハッシュ関数のインデックス番号とハッシュ関数を特定するハッシュ係数の値(ここではR〜Rの各値)とを対応づけたハッシュ関数実体管理表20(図6参照)に、インデックス番号1に対応づけて、ハッシュ関数として採用された候補ハッシュ関数を特定するハッシュ係数の値(ここではR〜Rの各値)を格納する(ステップA80)。また、CPUキャッシュメモリ111上に作成した対応表、即ち、各小規模データセットの識別番号であるCRC値とハッシュ関数のインデックス番号とを対応づけたハッシュ関数インデックス表21(図6参照)に、a個の小規模データセットのそれぞれの識別番号であるCRC値に対応づけて、a個の小規模データセットのそれぞれに対するハッシュ関数として割り当てられたハッシュ関数のインデックス番号1を格納する(ステップA80)。なお、ここでは、閾値thdは、iが1≦i≦15の場合には「217−i」とし、i=16の場合には「0」とする。これにより、ハッシュ関数の採用条件がだんだん厳しくなるようにしている。
そして、iが「16」であるか、即ち、i=16であるかを判定し(ステップA90)、i=16でない場合は、iをインクリメントし、即ち、i=i+1とし(ステップA100)、ステップA20へ戻る。この段階では、i=16でないため、i=2として、ステップA20へ戻り、候補ハッシュ関数として、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数を選出する。例えば、ハッシュ係数Rの値を「2」として1つのハッシュ関数を選出し、これを候補ハッシュ関数とすれば良い。その後、上述と同様の処理を繰り返す。
一方、ステップA70で、m−aが閾値thdを超えていると判定した場合は、NOルートへ進んで、候補ハッシュ関数をインデックス番号1のハッシュ関数として採用せずに、ステップA20へ戻り、i=1としたまま、候補ハッシュ関数として、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数を選出する。例えば、ハッシュ係数Rの値を「2」として1つのハッシュ関数を選出し、これを候補ハッシュ関数とすれば良い。その後、上述と同様の処理を繰り返す。
その後、ステップA90で、i=16であると判定した場合、インデックス番号1〜16の16個のハッシュ関数が決定されたことになるため、処理を終了する。
なお、候補ハッシュ関数として、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数を選出する場合、ハッシュ係数Rの値を「1」から順番に大きくなるようにしても良いし、ハッシュ係数Rの値として1〜256の中の任意の値を順番に選ぶようにしても良い。但し、候補ハッシュ関数として選出され、上述の処理を行なったハッシュ関数が再度選出されることがないように、上述の処理を行なった後に(例えばステップA70やステップA90のNOルートで)、そのハッシュ関数を使用済みとするのが好ましい。これにより、ステップA20で候補ハッシュ関数を選出する際に未使用のハッシュ関数が選出されるようにすることができる。また、上述のように、インデックス番号1から16まで順番にハッシュ関数を決定していく場合、インデックス番号1のハッシュ関数を決定する処理では、全ての小規模データセットに対して、ハッシュ値を算出するなどの上述の処理を行なう必要があるが、インデックス番号2以降のハッシュ関数を決定する処理では、ハッシュ関数が割り当てられていない小規模データセットに対して、ハッシュ値を算出するなどの上述の処理を行なえば良い。また、上述のように、i=16の場合、閾値thdを「0」とすることで、未割り当ての全ての小規模データセットが上述のステップA40の条件を満たしている場合にインデックス番号16のハッシュ関数が決定されるようにして、ハッシュ関数が割り当てられていない小規模データセットがないようにしているが、これに限られるものではなく、ハッシュ関数が割り当てられていない小規模データセットがないようにすれば良い。例えば、閾値thdは変化させずに一定とし、i=16であるかの判定(ステップA90)を、ステップA80の前に入れ、i=16でないと判定した場合は、ステップA100へ進み、i=16であると判定した場合は、さらに、ハッシュ関数が割り当てられていない小規模データセットがあるかを判定し、ハッシュ関数が割り当てられていない小規模データセットはないと判定したときに、ステップA80へ進み、ハッシュ関数が割り当てられていない小規模データセットがあると判定したときは、ステップA20へ戻り、ハッシュ関数が割り当てられていない小規模データセットがないと判定されるまで同様の処理を繰り返すようにしても良い。
このようにして、データ格納処理部2は、ハッシュ関数決定部8によって、使用する16個のハッシュ関数、即ち、複数の小規模データセットに対して割り当てられるインデックス番号1〜16の16個のハッシュ関数を決定する。このようにして決定された16個のハッシュ関数によってハッシュ関数プールが構成される。そして、16個のハッシュ関数からなるハッシュ関数プールから各小規模データセットに対するハッシュ関数が割り当てられる。このため、データ格納処理部2は、ハッシュ関数決定部8によって、16個のハッシュ関数からなるハッシュ関数プールを決定する。また、データ格納処理部2は、ハッシュ係数値表作成部9によって、インデックス番号1〜16に、16個のハッシュ関数のそれぞれを特定するハッシュ係数の値(ここではR〜Rの各値;各値のサイズは2バイトである)を対応づけて、CPUキャッシュメモリ111上にハッシュ係数値表20(図6参照)を作成する。なお、ハッシュ係数値表20を、ハッシュ係数セットともいう。また、データ格納処理部2は、対応表作成部10によって、複数の小規模データセットのそれぞれの識別番号であるCRC値に、16個のハッシュ関数のインデックス番号1〜16のうち、割り当てられたハッシュ関数のインデックス番号を対応づけて、CPUキャッシュメモリ111上に対応表21(図6参照)を作成する。このように、対応表21及びハッシュ係数値表20(図6参照)を作成するだけで良いため、作用素の圧縮処理が必要な上述のCHDアルゴリズムの場合と比較して、データの格納処理を高速に行なうことが可能である。
ここでは、複数の小規模データセットに割り当てられるハッシュ関数は16個であるため、各小規模データセットのCRC値に対応づけられるハッシュ関数のインデックス番号、即ち、16個のハッシュ関数を識別する識別子は、4ビット(固定長)で表現することができる。つまり、m個の小規模データセットの場合、m行1列のマトリックを用い、各行に4ビットで表現される16個のハッシュ関数のインデックス番号のいずれかを格納することで、対応表を作成することができる。ここで、小規模データセットの数は、格納するデータの数で決まるが、例えば1つの小規模データセットに平均4つのデータが含まれるようにすると、小規模データセットの数は全データ数の4分の1となる。そして、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量は4ビットであるため、1つのデータ当たりで必要な情報量は約1ビットとなる。また、16個のハッシュ関数を用いる場合、ハッシュ値係数表に、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値として例えばR〜Rの8個の値を格納し、各値のサイズを2バイトとすると、ハッシュ値係数表のサイズは256バイトとなる。したがって、格納するデータの数がnの場合、各小規模データセットにハッシュ関数を対応づけるのに必要な1つのデータ当たりの情報量は、約(n+2048)ビットとなる。例えば、データ1つ当たりの情報量は、nが100万の場合、1.002nビットとなり、nが10万の場合、1.020nビットとなり、nが1万の場合、1.205nビットとなる(格納率約80%)。このように、データ1つ当たりの情報量が1.62nビット(格納率約81%)、2.3nビット(格納率100%)となるCHDアルゴリズムと比較して、データ1つ当たりの情報量を少なくすることができ、特に、大規模なデータセットになるほど、データ1つ当たりの情報量を少なくすることができる。このため、大規模データセットを小規模データセットに分割して格納する場合に、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量を少なくできる。これにより、これをCPUキャッシュメモリ111上に確実に保持することが可能となり、この結果、高速なデータ検索を実現することが可能となる。つまり、全ての小規模データセットに対するハッシュ関数の識別子長を短くし、メモリ使用量を削減することで、キャッシュヒット率を向上させ、データ検索の高速化を実現することが可能となる。
なお、ここでは、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値として例えばR〜Rの8個の値を格納してハッシュ係数値表を作成しているが、これらに限られるものではなく、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値として、1個の値又は複数個の値を格納してハッシュ係数値表を作成しても良い。例えば、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてRの1個の値を格納してハッシュ係数値表を作成するようにしても良いし、また、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてR〜RのS個(S≧2)の値を格納してハッシュ係数値表を作成するようにしても良い。上述のように、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数を用いてハッシュ値を算出する場合、上述の積和式から分かるように、ハッシュ係数の値としてR〜Rのn個の値が必要になる。このため、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値として1個の値又はn個よりも少ない複数の値を格納してハッシュ係数値表を作成した場合には、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているハッシュ係数の値を用いて、ハッシュ係数値表に格納されていないハッシュ係数の値を算出すれば良い。例えば、ハッシュ係数の値としてRの値のみを格納してハッシュ係数値表を作成した場合、ハッシュ値を算出する際に、Rの値を用いてR〜Rの値を算出すれば良い。また、ハッシュ値の計算を高速化すべく、積和演算又はベクトル演算の計算機能を備えたCPUを用いて(例えばCPUのSIMD命令を用いて)、その計算機能によって上述の積和式の計算を行なうことで、あるいは、並列計算(同時並列計算)が可能なCPU(例えばマルチコアCPU、即ち、単一のCPUデバイスが複数のCPUユニットを持つもの)や複数のCPUを用いて、上述の積和式の並列計算を行なってハッシュ値を算出する場合、使用されるCPUに応じて、ハッシュ係数値表に格納しておくハッシュ係数の値の個数を決めても良い。例えば、上述の積和式をZ個の項(掛け算からなる部分式)に分割し、例えばCPUのSIMD命令を用いて逐次計算することでハッシュ値を算出する場合、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてR〜RのZ個の値を格納してハッシュ係数値表を作成しておけば良い。例えば、上述の積和式を8個の項に分割し、これらを例えばCPUのSIMD命令を用いて逐次計算することでハッシュ値を算出する場合、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてR〜Rの8個の値を格納してハッシュ係数値表を作成しておけば良い。この場合、データのキー列が{x,x,x,...,x}(n≦8)の場合、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているR〜Rの8個の値を用いて、R〜Rを含む8個の項を例えばCPUのSIMD命令を用いて逐次計算してハッシュ値を高速に算出することが可能となる。また、データのキー列が{x,x,x,...,x}(n>8)の場合、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているR〜Rの8個の値を任意に用いてR(n≧9)の値を算出し、R〜Rを含むn個の項を8個の項ずつ例えばCPUのSIMD命令を用いて逐次計算することで、ハッシュ値を高速に算出することが可能となる。また、例えば、上述の積和式をZ個の項(掛け算からなる部分式)に分割し、これらを並列計算が可能なCPU又は複数のCPUを用いて並列計算することでハッシュ値を算出する場合、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてR〜RのZ個の値を格納してハッシュ係数値表を作成しておけば良い。例えば、上述の積和式を8個の項に分割し、これらを並列計算が可能なCPU又は複数のCPUを用いて並列計算することでハッシュ値を算出する場合、16個のハッシュ関数のそれぞれについて、ハッシュ係数の値としてR〜Rの8個の値を格納してハッシュ係数値表を作成しておけば良い。この場合、データのキー列が{x,x,x,...,x}(n≦8)の場合、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているR〜Rの8個の値を用いて、R〜Rを含む8個の項を並列計算してハッシュ値を高速に算出することが可能となる。また、データのキー列が{x,x,x,...,x}(n>8)の場合、ハッシュ値を算出する際に、ハッシュ係数値表に格納されているR〜Rの8個の値を任意に用いてR(n≧9)の値を算出し、R〜Rを含むn個の項を、8個の項ずつ並列計算することで、ハッシュ値を高速に算出することが可能となる。また、例えばCPUのSIMD命令を用いる方法と、並列計算する方法とを組み合わせることで、ハッシュ値を高速に算出することも可能である。なお、ハッシュ係数値表がCPUキャッシュメモリ上に保持されるように、CPUキャッシュメモリのサイズに応じてハッシュ係数値表のサイズを決めるのが好ましい。つまり、ハッシュ係数値表がCPUキャッシュメモリ上に保持されるように、CPUキャッシュメモリのサイズに応じて、ハッシュ係数値表に格納しておくハッシュ係数の値の個数を決めるのが好ましい。
また、ここでは、複数のハッシュ関数を決定する処理(図3のステップS20)、ハッシュ係数値表を作成する処理(図3のステップS30)及び対応表を作成する処理(図3のステップS40)を並行して行なう場合を例に挙げて説明しているが、これに限られるものではない。例えば、複数のハッシュ関数を決定する処理を行なった後に、ハッシュ係数値表を作成する処理及び対応表を作成する処理を行なうようにしても良い。
次に、図3に示すように、データ格納処理部2は、ハッシュテーブル作成部(ハッシュ情報作成部)11によって、複数のデータセットのそれぞれに対する複数のハッシュテーブル22を作成する(ステップS50)。特に、データ格納処理部2は、ハッシュテーブル作成部11によって、データセット毎に、複数のデータのそれぞれのキーに基づいてデータセットに対するハッシュ関数によって求められるハッシュ値に基づいて特定される第1格納位置又は第2格納位置にデータ及びキーを格納してデータセットに対するハッシュテーブル22を作成する。これにより、メインメモリ101上に複数のハッシュテーブル22が保持され、メインメモリ101上に複数のハッシュテーブル22を記憶するハッシュテーブル記憶部(ハッシュ情報記憶部)6が作成される。
ここでは、図7に示すように、データ格納処理部2は、ハッシュテーブル作成部11によって、まず、小規模データセットに対するハッシュテーブル22のサイズを決定する(ステップC10)。例えば、小規模データセットに含まれるデータの数n′が「4」の場合、小規模データセットに対するハッシュテーブル22のサイズを例えばROUND(n′÷0.8)で「5」に決定すれば良い。これにより、小規模データセットのサイズに基づいてハッシュテーブル22のサイズを決定することで、小規模データセットに対するハッシュテーブル22のデータ格納率を約80%にすることができる。
次に、データ格納処理部2は、ハッシュテーブル作成部11によって、各小規模データセットに対するハッシュテーブル22を作成し、メインメモリ101に格納する(ステップC20〜C80)。つまり、各小規模データセットに対するハッシュテーブル22として、上述のようにして決定したサイズのハッシュテーブル22をメインメモリ101上に作成し、これに、各小規模データセットに含まれる各データのキーを用いて各小規模データセットに対して割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される第1格納位置又は第2格納位置に各データ及び各キーを格納することで、各小規模データセットに対するハッシュテーブル22を作成する。
例えば、上述のデータ格納処理部2のハッシュ関数決定部8による処理において作成された各小規模データセットに対する仮格納用テーブルを用いて、各小規模データセットに対するハッシュテーブル22を作成すれば良い。なお、ここでは、各小規模データセットについて、各小規模データセットに対して割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納してハッシュテーブル22を作成することになる。また、ここでは、1番目の小規模データセットに対する1番目のハッシュテーブル22から16番目の小規模データセットに対する16番目のハッシュテーブル22まで、16個のハッシュテーブル22を順番に作成する場合を例に挙げて説明する。
つまり、まず、図7に示すように、データ格納処理部2は、ハッシュテーブル作成部11によって、ハッシュテーブル22の対応する番地に既にデータが格納されているかを判定し(ステップC20)、まだデータが格納されていない場合には、NOルートへ進み、仮格納用テーブルに格納されているデータを、ハッシュテーブルの対応する番地に格納し(ステップC30)、既に格納されている場合には、YESルートへ進み、仮格納用テーブルに格納されているデータを、ハッシュテーブルの対応する番地の次の番地に格納する(ステップC80)。
この段階は、1番目の小規模データセットに対する仮格納用テーブルの最初の番地(行)に格納されている1つ目のデータを、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の最初の番地(行)に格納する段階であり、まだデータは格納されていないため、NOルートへ進み、1番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されている1つ目のデータを、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の最初の番地に格納する(ステップC30)。
次に、データ格納処理部2は、ハッシュテーブル作成部11によって、仮格納用テーブルの一の番地に2つのデータが格納されているか否かを判定し(ステップC40)、仮格納用テーブルの一の番地に2つのデータが格納されている場合には、YESルートへ進み、2つ目のデータを、ハッシュテーブル22の対応する番地の次の番地に格納し(ステップC50)、仮格納用テーブルの一の番地に2つのデータが格納されていない場合には、NOルートへ進んで、ステップS60へ進む。
この段階では、1番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されているデータが2つあるか判定し(ステップC40)、1番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されているデータが2つある場合には、YESルートへ進み、2つ目のデータを、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の2番目の番地に格納する(ステップC50)。一方、1番目の小規模データセットに対する仮格納用テーブルの最初の番地に格納されているデータが2つない場合は、NOルートへ進んで、ステップC60へ進む。
次に、データ格納処理部2は、ハッシュテーブル作成部11によって、仮格納用テーブルに格納されている全てのデータを、メインメモリ101上のハッシュテーブル22に格納したか否かを判定し(ステップC60)、全てのデータを格納していないと判定した場合は、NOルートへ進んで、ステップC20へ戻り、同様の処理を繰り返す。
この段階では、全てのデータを格納していないため、ステップC20へ戻る。そして、この段階は、1番目の小規模データセットに対する仮格納用テーブルの2番目の番地に格納されている1つ目のデータを、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の2番目の番地に格納する段階であるため、ステップC20で、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の2番目の番地に既にデータが格納されているか否かを判定する(ステップC20)。
この判定の結果、まだデータが格納されていないと判定した場合は、NOルートへ進んで、1番目の小規模データセットに対する仮格納用テーブルの2番目の番地に格納されている1つ目のデータを、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の2番目の番地に格納する(ステップC30)。そして、1番目の小規模データセットに対する仮格納用テーブルの2番目の番地に格納されているデータが2つあるか判定し(ステップC40)、1番目の小規模データセットに対する仮格納用テーブルの2番目の番地に格納されているデータが2つある場合には、YESルートへ進み、2つ目のデータを、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の3番目の番地に格納する(ステップC50)。一方、1番目の小規模データセットに対する仮格納用テーブルの2番目の番地に格納されているデータが2つない場合は、NOルートへ進んで、ステップC60へ進む。
一方、ステップC20で既にデータが格納されていると判定した場合は、YESルートへ進んで、1番目の小規模データセットに対する仮格納用テーブルの2番目の番地に格納されている1つ目のデータを、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の3番目の番地に格納する(ステップC80)。
以後、同様の処理を繰り返して、1番目の小規模データセットに対する仮格納用テーブルの3番目以降の番地に格納されているデータを、メインメモリ101上の1番目の小規模データセットに対する1番目のハッシュテーブル22の対応する番地又はその次の番地に格納する。
そして、ステップC60で、全てのデータを格納したと判定した場合は、YESルートへ進み、さらに、全ての小規模データセットに対するハッシュテーブル22を作成したか否かを判定する(ステップC70)。この判定の結果、全ての小規模データセットに対するハッシュテーブル22を作成したと判定した場合は、処理を終了し、全ての小規模データセットに対するハッシュテーブル22を作成していないと判定した場合は、NOルートへ進んで、ステップC10へ戻り、同様の処理を繰り返す。
この段階は、1番目の小規模データセットに対する1番目のハッシュテーブル22として、1番目の小規模データセットに対して割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納したハッシュテーブル22を、メインメモリ101上に作成した段階であるため、ステップC70で、全ての小規模データセットに対するハッシュテーブル22を作成していないと判定し、NOルートへ進んで、ステップC10へ戻り、同様の処理を繰り返して、2番目以降の小規模データセットに対する2番目以降のハッシュテーブル22を、メインメモリ101上に作成する。
そして、ステップC70で、全ての小規模データセットに対するハッシュテーブル22を作成したと判定した場合は、処理を終了する。
これにより、各小規模データセットに対する各ハッシュテーブル22として、各小規模データセットに対して割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納したハッシュテーブル22を、メインメモリ101上に作成することができる。このような準完全ハッシュ関数に基づいて作成されるハッシュテーブル22は、データがハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納されていることを保証する。このため、後述するように、データ検索時には、これらの番地に格納されているデータを一度に読み出し、どちらの番地にデータが格納されているかを判定すれば良いため、完全ハッシュ関数を用いる場合と比較して、データ検索効率の低下を抑えることができる。つまり、上述のように、完全ハッシュ関数を選出する場合よりもハッシュ関数の選出条件を緩めることで、ハッシュ関数の選出を容易に、かつ、高速に行なうことができるようにしながら、完全ハッシュ関数を用いる場合と比較して、データ検索効率の低下を抑えることができる。
なお、ここでは、上述のデータ格納処理部2のハッシュ関数決定部8による処理において作成された各小規模データセットに対する仮格納用テーブルを用いて、各小規模データセットに対するハッシュテーブル22を作成しているが、これに限られるものではない。例えば、図8に示すように、データ格納処理部2は、ハッシュテーブル作成部11によって、小規模データセットに対するハッシュテーブル22のサイズを決定し(ステップD10)、小規模データセットの識別番号であるCRC値を用いて対応表21(図6参照)からインデックス番号を取得し(ステップD20)、取得したインデックス番号を用いてハッシュ係数値表20(図6参照)から小規模データセットに割り当てられたハッシュ関数を特定するハッシュ係数の値を取得し(ステップD30)、これを用いて小規模データセットに割り当てられたハッシュ関数によって小規模データセットに含まれる各データのキーに基づいてハッシュ値を算出し(ステップD40)、このハッシュ値を小規模データセットに対するハッシュテーブル22のサイズで割った余りの値を算出し(ステップD50)、この余りの値が小さい順に、上述と同様に、メインメモリ101上の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて(ここではハッシュ値に基づいて算出される余りの値によって)特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、各小規模データセットに対するハッシュテーブルを作成し(ステップD60)、ステップD70で、全ての小規模データセットに対するハッシュテーブル22を作成したと判定するまで同様の処理を繰り返すようにしても良い。なお、ここでは、ハッシュテーブル22のサイズを最初に決めているが、これに限られるものではなく、この処理(ステップD10)は、少なくともハッシュテーブル22にデータを格納する処理(ステップD60)を行なう前に行なえば良い。
なお、ここでは、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納してハッシュテーブル22を作成する場合を例に挙げて説明しているが、これに限られるものではなく、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はこれに連続する格納位置(第2格納位置)に複数のデータの全てを格納してハッシュテーブルを作成すれば良い。例えば、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又はこの後の複数番地(第2格納位置)に複数のデータの全てを格納してハッシュテーブルを作成しても良い。ここで、第1格納位置としての番地からいくつ後の番地までを第2格納位置とするかは、データ検索処理時に、使用するCPUにおいて、1回のロード命令の実行によってロード可能なデータサイズに応じて決めれば良い。例えば、使用するCPUにおいて、各番地のデータとキーの合計サイズをdとし、1回のロード命令(例えば、汎用レジスタに対する汎用ロード命令、又は、XMMレジスタやYMMレジスタなどのSIMD命令用レジスタに対応するSIMDロード命令)の実行によって、CPUのレジスタにロード可能なデータサイズの最大値をDとし、y番地後までを第2格納位置とする場合、yを0≦y≦FLOOR(D÷d)の範囲から決定すれば良い。ここで、yの値に大きい値を選ぶと、あるハッシュ関数が準完全ハッシュ関数である確率が高まるためにハッシュ関数を決定する処理が容易になり、かつ、大量のデータを格納する際に用いるハッシュ関数の数をより少なくすることが可能となる。なお、yの値に大きい値を選ぶと、データ検索時に、検索対象データを見つけ出すか又は検索対象データが格納されていないと判定するまでに要する時間(CPU時間)がおよそ数ナノ秒から数十ナノ秒ほど長くなる。例えば、このような判定に要するCPU時間は平均してy/2クロック程度である。このため、yの値に大きい値を選ぶことで上述の判定に要する時間が長くなっても、これが検索処理能力に与える影響は無視できるほど小さい。ここで、また、例えば、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はその前の格納位置(第2格納位置)に複数のデータの全てを格納してハッシュテーブル22を作成しても良い。
次に、本データ検索装置1に備えられるデータ検索処理部3による処理、即ち、本データ検索装置1においてCPU102がメインメモリ101に読み込まれたデータ検索プログラムに従って実行する処理(データ検索方法)について、図9を参照しながら説明する。
ここでは、データ検索処理部3は、データの検索依頼を受けると、以下の手順で、メインメモリ101上の複数のハッシュテーブル22に対してデータ検索を行なう。
まず、図9に示すように、データ検索処理部3は、ハッシュテーブル特定部(ハッシュ情報特定部)12によって、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュテーブル22の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュテーブル22を特定する(ステップE10)。
ここでは、データ検索処理部3は、検索対象データのキーを受けとったら、ハッシュテーブル特定部12によって、検索対象データのキーのCRC32値を計算し、算出されたCRC32値を小規模データセットの数mで割った余りの値(CRC値)を算出する。このようにして検索対象データのキーに基づいて算出したCRC値は、n個のデータを含む大規模データセットを分割したm個の小規模データセットの識別番号、即ち、m個の小規模データセットのそれぞれを格納するm個のハッシュテーブルの識別番号として用いることができる。このため、上述のようにして検索対象データのキーに基づいて算出したCRC値によって、m個のハッシュテーブルの中から、検索対象データを含むデータセットを格納するハッシュテーブルを特定することができる。つまり、検索対象データのキーに基づいて、検索対象データを含むデータセットを格納するハッシュテーブルの識別番号(識別子)を取得することができる。例えば、SSE4.2拡張命令セットをサポートするCPUを用いる場合、ハードウェア的に組み込まれたCRC32c演算命令(組み込み関数名:crc32)を用いて高速に検索対象データを含むデータセットを格納するハッシュテーブルを特定することができる。
次に、データ検索処理部3は、ハッシュ係数値取得部13によって、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応表21(図6参照)及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表20(図6参照)を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得する(ステップE20、E30)。
ここでは、データ検索処理部3は、ハッシュ係数値取得部13によって、上述のようにして検索対象データのキーに基づいて算出したCRC値を使って、CPUキャッシュメモリ111上の対応表21(図6参照)を用いて、インデックス番号を取得し(ステップE20)、このインデックス番号を用いて、CPUキャッシュメモリ111上のハッシュ係数値表22(図6参照)から、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値(ここではR〜Rの各値)を取得する(ステップE30)。このようにして、検索対象データを含むデータセットを格納するハッシュテーブル22に割り当てられたハッシュ関数(準完全ハッシュ関数)を特定するハッシュ係数の値をCPUキャッシュメモリ111から取得する。このように、対応表21及びハッシュ係数値表20(図6参照)は、いずれもCPUキャッシュメモリ111上にあるため、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値へのアクセスを高速化することができる。また、インデックス番号は4ビットの固定長(4ビット固定長エントリ)で構成されているため、先頭アドレス+インデックス番号×4ビットという四則演算で所望のハッシュ係数の値が格納されている物理位置にアクセス可能なので、アクセスの高速化を図ることができる。これにより、検索対象データを含むデータセットを格納するハッシュテーブル22上のデータ位置の特定を高速に行なうことが可能となる。
次に、データ検索処理部3は、ハッシュ値計算部14によって、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算する(ステップE40)。
ここでは、データ検索処理部3は、ハッシュ値計算部14によって、検索対象データのキー、及び、上述のようにして取得した、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値(ここではR〜Rの各値)を用いて、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数によってハッシュ値を計算する(ステップE40)。そして、算出したハッシュ値を、検索対象データを含むデータセットに対するハッシュテーブルのサイズ(ここでは5)で割った余りの値を算出する(ステップE50)。なお、ハッシュ値の計算は、上述のデータ格納処理部2のハッシュ関数決定部8におけるハッシュ値の計算と同様に行なえば良い。このように、単一のハッシュ関数f(x)によってハッシュ値を計算するため、f1(x)+αf2(x)+βで表される完全ハッシュ関数によってハッシュ値を計算する、即ち、2つのハッシュ関数f1(x)、f2(x)の計算を必要とする、上述のCHDアルゴリズムと比較して、ハッシュ値の計算を高速に行なうことができる。
次に、データ検索処理部3は、読出部15によって、一のハッシュテーブル22から、ハッシュ値に基づいて特定される第1格納位置及び第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出す(ステップE60)。このように、ハッシュ値に基づいて特定される第1格納位置及び第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出すため、完全ハッシュ関数を用いる場合と比較して、データ検索効率の低下を抑えることができる。
ここでは、データ検索処理部3は、読出部15によって、上述のようにして検索対象データのキーに基づいて算出したCRC値によって特定されたハッシュテーブル22から、上述のようにして算出したハッシュ値をハッシュテーブルのサイズで割った余りの値によって特定される番地(第1格納位置)及び次の番地(第2格納位置)に格納されているデータ及びキーをメインメモリ101(又はCPUキャッシュメモリ111)から読み出す(ステップE60)。
なお、ここでは、上述のように、ハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に複数のデータの全てを格納したハッシュテーブル22を、メインメモリ101上に作成するようにしているため、ハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納されているデータ及びキーを読み出す場合を例に挙げて説明しているが、これに限られるものではなく、上述のデータ格納処理部2のハッシュテーブル作成部11によって作成されたハッシュテーブル22に応じて、ハッシュ値に基づいて特定される格納位置(第1格納位置)又はこれに連続する格納位置(第2格納位置)に格納されているデータ及びキーを読み出せば良い。例えば、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される番地(第1格納位置)又はこの後の複数番地(第2格納位置)に複数のデータの全てを格納してハッシュテーブル22を作成した場合には、ハッシュ値に基づいて特定される番地(第1格納位置)又はこの後の複数番地(第2格納位置)に格納されているデータ及びキーを読み出せば良い。ここで、第1格納位置としての番地からいくつ後の番地までを第2格納位置とするかは、使用するCPUにおいて、1回のロード命令の実行によってロード可能なデータサイズに応じて決めれば良い。例えば、使用するCPUにおいて、各番地のデータとキーの合計サイズをdとし、1回のロード命令(例えば、汎用レジスタに対する汎用ロード命令、又は、XMMレジスタやYMMレジスタなどのSIMD命令用レジスタに対応するSIMDロード命令)の実行によって、CPUのレジスタにロード可能なデータサイズの最大値をDとし、y番地後までを第2格納位置とする場合、yを0≦y≦FLOOR(D÷d)の範囲から決定すれば良い。また、例えば、小規模データセットに割り当てられたハッシュ関数によって算出したハッシュ値に基づいて特定される格納位置(第1格納位置)又はその前の格納位置(第2格納位置)に複数のデータの全てを格納してハッシュテーブル22を作成した場合には、ハッシュ値に基づいて特定される格納位置(第1格納位置)又はその前の格納位置(第2格納位置)に格納されているデータ及びキーを読み出せば良い。
次に、データ検索処理部3は、出力部16によって、第1格納位置又は第2格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する(ステップE70〜E110)。
ここでは、データ検索処理部3は、出力部16によって、上述のようにしてハッシュ値に基づいて特定される番地(第1格納位置)及び次の番地(第2格納位置)から読み出したキーが、検索対象データのキーと一致するかを判定する。つまり、まず、ハッシュ値に基づいて特定される番地から読み出したキーが、検索対象データのキーと一致するかを判定し(ステップE70)、次に、ハッシュ値に基づいて特定される番地の次の番地から読み出したキーが、検索対象データのキーと一致するかを判定する(ステップE90)。これらの判定の結果、ハッシュ値に基づいて特定される番地から読み出したキーが、検索対象データのキーと一致すると判定した場合は、ハッシュ値に基づいて特定される番地から読み出したキーに対応づけられているデータを、検索対象データとして出力する(ステップE80)。また、ハッシュ値に基づいて特定される番地の次の番地から読み出したキーが、検索対象データのキーと一致すると判定した場合は、ハッシュ値に基づいて特定される番地の次の番地から読み出したキーに対応づけられているデータを、検索対象データとして出力する(ステップE100)。さらに、ハッシュ値に基づいて特定される番地から読み出したキー、及び、ハッシュ値に基づいて特定される番地の次の番地から読み出したキーが、いずれも、検索対象データのキーと一致しないと判定した場合は、検索失敗メッセージ(エラーメッセージ)を出力する(ステップE110)。
したがって、本実施形態にかかるデータ検索装置、データ格納方法及びデータ検索方法によれば、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることができるという利点がある。
特に、上述のように、本実施形態にかかるデータ検索装置、データ格納方法及びデータ検索方法では、上述の準完全ハッシュ関数を用いて少数のハッシュ関数を再利用し、上述の対応表21及びハッシュ係数値表20(図6参照)を用いることで、データ検索効率を低下させずに、データ格納効率を下げずに、ハッシュ関数によってハッシュ値を計算する際にCPUキャッシュメモリ111へのアクセスだけで済むようにしてデータ検索速度を向上させることができるという利点がある。
つまり、上述のように、大規模データセットに対して完全ハッシュ関数を算出する場合の算出コストを抑える方法として、大規模データセットを複数の小規模データセットに分割し、複数の小規模データセットのそれぞれに対して個別の完全ハッシュ関数を算出するCHDアルゴリズムがある。
しかしながら、CHDアルゴリズムでは、小規模データセットの数に応じた数の完全ハッシュ関数を用いることになり、データセットが大規模になるほど、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量が増大し、メモリ領域を多く使用することになる。この場合、読み出し速度の速いCPUキャッシュメモリに全体を格納するのが困難となる。このため、ハッシュ関数によってハッシュ値を計算する際に、一定の確率でメインメモリへのアクセスが発生し、メインメモリへのアクセスはCPUキャッシュメモリへのアクセスと比較して数十倍から数百倍低速であるため、結果的に、データ検索速度が低下してしまう。
また、上述のように、上述のCHDアルゴリズムでは、複数の小規模データセットのそれぞれに対応する個別の完全ハッシュ関数として、2つのハッシュ関数f1(x)、f2(x)と2つの作用素α、βによって規定される完全ハッシュ関数、即ち、式x=f1(x)+αf2(x)+βを決め、これを用いてハッシュ値xを算出する。そして、この完全ハッシュ関数によって求められたハッシュ値に基づいてデータを格納してハッシュテーブルを作成することになる。しかしながら、この完全ハッシュ関数の決定、ハッシュ値の算出及びハッシュテーブルの作成には時間がかかる。このため、データの格納に時間がかかり、データ格納速度が遅くなる。
また、上述のCHDアルゴリズムでは、複数の小規模データセットのそれぞれに対応する個別の完全ハッシュ関数の作用素α、βをそれぞれ圧縮して保持し、データ検索時に圧縮された各作用素α、βを伸長して元の作用素とする。そして、この元の作用素を用いて上述の完全ハッシュ関数によってハッシュ値を算出し、算出されたハッシュ値を用いてデータを検索することになる。しかしながら、このハッシュ値の算出には時間がかかる。このため、データの検索に時間がかかり、データ検索速度が遅くなる。
これに対し、データ検索速度を向上させるためには、少数のハッシュ関数を再利用することで、即ち、一つのハッシュ関数を一つの小規模データセットに割り当てるのに代えて一つのハッシュ関数を複数の小規模データセットに割り当てることで、使用するハッシュ関数の数を減らし、情報量を低減することが考えられる。
しかしながら、CHDアルゴリズムのようにハッシュ関数として完全ハッシュ関数を用いる限り、それほどハッシュ関数の数を減らすことができず、情報量を十分に低減するのは難しい。つまり、情報量を十分に削減するためには、使用するハッシュ関数の数を数十以下にすることが必要である。しかし、あるハッシュ関数が所与の小規模データセットに対する完全ハッシュ関数である確率は非常に低いため、数十以下のハッシュ関数から全ての小規模データセットの完全ハッシュ関数を選出するのは困難である。このため、ハッシュ関数として完全ハッシュ関数を用いる限り、情報量を十分に低減できるほど、使用するハッシュ関数の数を減らすのは難しい。
この場合、ハッシュ関数として不完全ハッシュ関数を用いれば、使用するハッシュ関数の数を減らし、情報量を低減することができる。しかしながら、ハッシュ関数として不完全ハッシュ関数を用いると、データ検索効率が低下してしまう。
また、例えば10個のデータを格納できるサイズのハッシュテーブルに8個のデータを格納する代わりに7個のデータを格納するなど、ハッシュテーブルの格納率を下げることで、あるハッシュ関数が所与の小規模データセットに対する完全ハッシュ関数である確率を高め、使用するハッシュ関数の数を減らし、情報量を低減することも考えられる。しかしながら、データの格納効率が低下してしまう。そして、格納効率の低いハッシュテーブルを用いると、メモリ使用量を圧迫することになる。
そこで、本実施形態にかかるデータ検索装置、データ格納方法及びデータ検索方法では、上述の準完全ハッシュ関数を用いて少数のハッシュ関数を再利用し、上述の対応表21及びハッシュ係数値表20(図6参照)を用いることで、データ検索効率を低下させずに、データ格納効率を下げずに、ハッシュ関数によってハッシュ値を計算する際にCPUキャッシュメモリ111へのアクセスだけで済むようにしてデータ検索速度を向上させることができるようにしている。つまり、完全ハッシュ関数と比較して同等のデータ検索効率を維持し、上述のCHDアルゴリズムと比較して同等のデータ格納効率を維持しながら、ハッシュ関数の再利用性を大幅に改善する準完全ハッシュ関数を用い、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量を削減することでキャッシュヒット率を高め、データ検索の高速化を実現することが可能となる。
なお、本実施形態では、16個のハッシュ関数を用いる場合を例に挙げて説明しているが、これに限られるものではない。例えば、32個のハッシュ関数を用いても良い。この場合、32個のハッシュ関数を識別する識別子(インデックス番号)は、5ビットで表現することになるため、対応表に必要な情報量は、16個のハッシュ関数を用いる場合と比較して約25%増加する。しかし、この程度の増加であれば、CPUキャッシュメモリ上に保持することが可能であるため、高速なデータ検索を実現することが可能である。一方、使用するハッシュ関数の数を増やすと、ハッシュ関数を決定する処理は高速となる。これは、上述の実施形態の閾値thdを超えているか否かの判定においてハッシュ関数として採用される可能性が高くなり、試行回数が減るためである。例えば、格納するデータの数が50万を超える場合には、32個のハッシュ関数を用いるのが好ましい。なお、使用するハッシュ関数の数を8個以下とすると、上述の実施形態の閾値thdを超えているか否かの判定においてハッシュ関数として採用することが極端に困難となるため、使用するハッシュ関数の数は16個以上とするのが好ましい。ここで、使用するハッシュ関数の数をpとした場合、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量はceil(log(p))となる。このため、pを変えた場合、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量はlog(p)に比例して変化する。このため、キャッシュヒット率を向上させ、データ検索の高速化を図るためには、各小規模データセットにハッシュ関数を対応づけるのに必要な情報量(特に対応表に必要な情報量)が、CPUキャッシュメモリのサイズに応じたものとなるように、使用するハッシュ関数の数を決めることになる。
また、上述の実施形態のデータ検索装置、データ格納方法及びデータ検索方法は、例えば、完全一致検索、最長一致文字列検索などに用いることができる。ここで、完全一致検索としては、例えば、商品番号、型番号、店舗のバーコード、従業員番号、国番号、メールアドレスなどの一意なIDとの照合に用いられるものである。また、最長一致文字列検索は、例えば、字句解析及び構文解析(例えばコンパイラーなど)、形態素解析(例えば文字入力装置(IME)における変換処理など)、IP通信におけるルーティングテーブル探索、電話網におけるルーティングテーブル探索、貨物輸送における郵便番号などによる荷物の行き先振り分け、辞書方式のデータ圧縮における辞書への最長一致検索などに用いられるものである。
以下、最初に、完全一致検索の一例として従業員ID検索システムに、上述の実施形態のデータ検索装置、データ格納方法及びデータ検索方法を適用した場合を例に挙げて説明し、次いで、最長一致文字列検索の一例として辞書式データ圧縮システムに、データ検索装置、データ格納方法及びデータ検索方法を適用した場合を例に挙げて説明する。
[完全一致検索の一例としての従業員ID検索システム]
ここで、データ検索装置としての従業員ID検索システムは、従業員IDからその従業員IDを持つ従業員の氏名を検索するシステムである。
この従業員ID検索システムは、図10に示すようなデータセットの格納依頼を受けると、このデータセットを、以下の手順で、メインメモリ101上に作成されるハッシュテーブル22に格納する。
まず、従業員ID検索システムのデータ格納処理部2は、図10に示すような格納対象のデータセットを受けとったら、データ分割部7によって、図12に示すように、格納対象のデータセットを複数のデータセットに分割する。
ここでは、データ格納処理部2は、データ分割部7によって、図11に示すように、格納対象のデータセットを構成する複数のデータのそれぞれのキーのCRC32値を計算し、算出された各CRC32値を小規模データセットの数(ここでは5)で割った余りの値(CRC値)を算出する。そして、算出されたCRC値が同じデータが同じ小規模データセットに含まれるように、図12に示すように、複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割する。つまり、算出されたCRC値を、複数の小規模データセットの識別番号(データセット番号)として用い、複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割する。例えば、SSE4.2拡張命令セットをサポートするCPUを用いる場合、ハードウェア的に組み込まれたCRC32c演算命令(組み込み関数名:crc32)を用いて高速に複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割することができる。
次に、データ格納処理部2は、ハッシュ関数決定部8によって、図13に示すように、複数の小規模データセットのそれぞれに対する複数のハッシュ関数を決定する。
次に、データ格納処理部2は、ハッシュ係数値表作成部9(ハッシュ関数実体管理表作成部)によって、図14に示すように、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表(ハッシュ関数実体管理表)を作成する。
次に、データ格納処理部2は、対応表作成部10(ハッシュ関数インデックス表作成部)によって、図15に示すように、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表(ハッシュ関数インデックス表)を作成する。
次に、データ格納処理部2は、ハッシュテーブル作成部11によって、複数のデータセットのそれぞれに対する複数のハッシュテーブル22を作成する。
ここでは、データ格納処理部2は、ハッシュテーブル作成部11によって、まず、各小規模データセットに対応するハッシュテーブル22のサイズを決定する。例えば、各小規模データセットに含まれるデータの数n′が「4」の場合、各小規模データセットに対するハッシュテーブルのサイズをROUND(n′÷0.8)で「5」に決定すれば良い。これにより、各小規模データセットのサイズに基づいてハッシュテーブル22のサイズを決定することで、各小規模データセットに対するハッシュテーブル22のデータ格納率を約80%にすることができる。
次に、データ格納処理部2は、ハッシュテーブル作成部11によって、各小規模データセットに対するハッシュテーブル22を作成し、メインメモリ101に格納する。
ここでは、小規模データセットの識別番号であるCRC値を用いて対応表から取得したインデックス番号を用いて、ハッシュ係数値表から、小規模データセットに割り当てられたハッシュ関数を特定するハッシュ係数の値を取得し、これを用いて小規模データセットに割り当てられたハッシュ関数によって小規模データセットに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値を小規模データセットに対するハッシュテーブルのサイズで割った余りの値を算出し、この余りの値が小さい順に、メインメモリ上の小規模データセットに対するハッシュテーブルのハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、各小規模データセットに対するハッシュテーブルを作成する。
具体的には、識別番号(データセット番号)が「0」、即ち、CRC値が「0」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「0」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは5)で割った余りの値を算出すると、図16に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「0」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「0」の小規模データセットに対するハッシュテーブル22を作成すると、図17に示すようになる。
同様に、識別番号(データセット番号)が「1」、即ち、CRC値が「1」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「1」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは5)で割った余りの値を算出すると、図18に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「1」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「1」の小規模データセットに対するハッシュテーブル22を作成すると、図19に示すようになる。
また、同様に、識別番号(データセット番号)が「2」、即ち、CRC値が「2」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「2」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは5)で割った余りの値を算出すると、図20に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「2」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「2」の小規模データセットに対するハッシュテーブル22を作成すると、図21に示すようになる。
また、同様に、識別番号(データセット番号)が「3」、即ち、CRC値が「3」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「3」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは5)で割った余りの値を算出すると、図22に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「3」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「3」の小規模データセットに対するハッシュテーブル22を作成すると、図23に示すようになる。
また、同様に、識別番号(データセット番号)が「4」、即ち、CRC値が「4」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「4」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは5)で割った余りの値を算出すると、図24に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「4」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「4」の小規模データセットに対するハッシュテーブル22を作成すると、図25に示すようになる。
ところで、この従業員ID検索システムは、データの検索依頼を受けると、以下の手順で、メインメモリ101上の複数のハッシュテーブル22に対してデータ検索を行なう。
ここでは、検索対象データのキーとして従業員ID「0110」を受け取った場合を例に挙げて説明する。
まず、図26に示すように、従業員ID検索システムのデータ検索処理部3は、ハッシュテーブル特定部12によって、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュテーブル22の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュテーブル22を特定する。
ここでは、データ検索処理部3は、検索対象データのキーとして従業員ID「0110」を受けとったら(ステップF10)、ハッシュテーブル特定部12によって、検索対象データのキーとしての従業員ID「0110」のCRC32値を計算し(ステップF20)、算出されたCRC32値(ここでは「0x14429f04」)を小規模データセットの数(ここでは「5」)で割った余りの値(CRC値;ここでは「4」)を算出する(ステップF30)。
次に、データ検索処理部3は、ハッシュ係数値取得部13によって、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応表(図15参照)及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表(図14参照)を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得する(ステップF40、F50)。
ここでは、データ検索処理部3は、ハッシュ係数値取得部13によって、上述のようにして検索対象データのキーに基づいて算出したCRC値(ここでは「4」)を使って、CPUキャッシュメモリ111上の対応表(図15参照)を用いて、インデックス番号(ここでは「6」)を取得し(ステップF40)、このインデックス番号(ここでは「6」)を用いて、CPUキャッシュメモリ111上のハッシュ係数値表(図14参照)から、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値(ここではR〜Rの各値)を取得する(ステップF50)。
次に、データ検索処理部3は、ハッシュ値計算部14によって、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算する(ステップF60)。
ここでは、データ検索処理部3は、ハッシュ値計算部14によって、検索対象データのキー(ここでは従業員ID「0110」)、及び、上述のようにして取得した、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値(ここではR〜Rの各値)を用いて、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数によってハッシュ値を計算する(ステップF60)。そして、算出したハッシュ値を、検索対象データを含むデータセットに対するハッシュテーブル22のサイズ(ここでは「5」)で割った余りの値を算出し、この余りの値として「1」を得る(ステップF60)。
次に、データ検索処理部3は、読出部15によって、一のハッシュテーブル22から、ハッシュ値に基づいて特定される第1格納位置及び第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出す(ステップF70)。
ここでは、データ検索処理部3は、読出部15によって、上述のようにして検索対象データのキーに基づいて算出したCRC値(ここでは「4」)によって特定されたハッシュテーブル(4番目のハッシュテーブル)22から、上述のようにして算出したハッシュ値をハッシュテーブル22のサイズで割った余りの値(ここでは「1」)によって特定される番地(第1格納位置;ここでは「1」)及び次の番地(第2格納位置;ここでは「2」)に格納されているデータ及びキーをメインメモリ101から読み出す(ステップF70)。
次に、データ検索処理部3は、出力部16によって、第1格納位置又は第2格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する(ステップF80〜F100)。
ここでは、データ検索処理部3は、出力部16によって、まず、ハッシュ値に基づいて特定される番地(ここでは「1」)から読み出したキー(ここでは「0106」)が、検索対象データのキー(ここでは「0110」)と一致するかを判定し(ステップF80)、次に、ハッシュ値に基づいて特定される番地の次の番地(ここでは「2」)から読み出したキー(ここでは「0110」)が、検索対象データのキー(ここでは「0110」)と一致するかを判定する(ステップF90)。これらの判定の結果、ハッシュ値に基づいて特定される番地の次の番地(ここでは「2」)から読み出したキーが、検索対象データのキーと一致すると判定し、ハッシュ値に基づいて特定される番地の次の番地(ここでは「2」)から読み出したキー(ここでは「0110」)に対応づけられているデータ(ここでは「山本聡」)を得て(ステップF90)、検索対象データとして出力する(ステップF100)。
したがって、このような従業員ID検索システムに上述のデータ検索装置を適用することで、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることができるという利点がある。
[最長一致文字列検索の一例としての辞書式データ圧縮システム]
ここで、辞書式データ圧縮システムでは、上述のデータ検索装置1(データ格納方法及びデータ検索方法)をデータ圧縮のための辞書として用い、これに文字列(圧縮文字列)を与えることで、この文字列に対する圧縮符号を得ることができるようになっている。この場合、格納対象データは圧縮符号であり、そのキーは圧縮文字列である。なお、辞書式データ圧縮システムについては、例えば、特開平9−218877号公報、特開2011−221845号公報などに記載されたものがある。
この辞書式データ圧縮システムは、図27に示すようなデータセットの格納依頼を受けると、このデータセットを、以下の手順で、メインメモリ101上に作成されるハッシュテーブル22に格納する。
まず、辞書式データ圧縮システムに備えられる上述のデータ検索装置1のデータ格納処理部2は、図27に示すような格納対象のデータセットを受けとったら、データ分割部7によって、図29に示すように、格納対象のデータセットを複数のデータセットに分割する。
ここでは、データ格納処理部2は、データ分割部7によって、図28に示すように、格納対象のデータセットを構成する複数のデータのそれぞれのキーのCRC32値を計算し、算出された各CRC32値を小規模データセットの数(ここでは4)で割った余りの値(CRC値)を算出する。そして、算出されたCRC値が同じデータが同じ小規模データセットに含まれるように、図29に示すように、複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割する。つまり、算出されたCRC値を、複数の小規模データセットの識別番号(データセット番号)として用い、複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割する。例えば、SSE4.2拡張命令セットをサポートするCPUを用いる場合、ハードウェア的に組み込まれたCRC32c演算命令(組み込み関数名:crc32)を用いて高速に複数のデータを含む格納対象のデータセットを複数の小規模データセットに分割することができる。
次に、データ格納処理部2は、ハッシュ関数決定部8によって、図30に示すように、複数の小規模データセットのそれぞれに対する複数のハッシュ関数を決定する。
次に、データ格納処理部2は、ハッシュ係数値表作成部9(ハッシュ関数実体管理表作成部)によって、図31に示すように、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表(ハッシュ関数実体管理表)を作成する。
次に、データ格納処理部2は、対応表作成部10(ハッシュ関数インデックス表作成部)によって、図32に示すように、複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と複数のデータセットとを対応づける対応表(ハッシュ関数インデックス表)を作成する。
次に、データ格納処理部2は、ハッシュテーブル作成部11によって、複数のデータセットのそれぞれに対する複数のハッシュテーブル22を作成する。
ここでは、データ格納処理部2は、ハッシュテーブル作成部11によって、まず、各小規模データセットに対応するハッシュテーブル22のサイズを決定する。例えば、各小規模データセットに含まれるデータの数n′が「3」の場合、各小規模データセットに対するハッシュテーブル22のサイズをROUND(n′÷0.8)で「4」に決定すれば良い。また、例えば、各小規模データセットに含まれるデータの数n′が「4」の場合、各小規模データセットに対するハッシュテーブルのサイズをROUND(n′÷0.8)で「5」に決定すれば良い。これにより、各小規模データセットのサイズに基づいてハッシュテーブル22のサイズを決定することで、各小規模データセットに対するハッシュテーブル22のデータ格納率を約80%にすることができる。
次に、データ格納処理部2は、ハッシュテーブル作成部11によって、各小規模データセットに対するハッシュテーブル22を作成し、メインメモリ101に格納する。
ここでは、小規模データセットの識別番号であるCRC値を用いて対応表から取得したインデックス番号を用いて、小規模データセットに割り当てられたハッシュ関数を特定するハッシュ係数の値を取得し、これを用いて小規模データセットに割り当てられたハッシュ関数によって小規模データセットに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値を小規模データセットに対するハッシュテーブル22のサイズで割った余りの値を算出し、この余りの値が小さい順に、メインメモリ101上の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、各小規模データセットに対するハッシュテーブル22を作成する。
具体的には、識別番号(データセット番号)が「0」、即ち、CRC値が「0」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「0」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは4)で割った余りの値を算出すると、図33に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「0」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「0」の小規模データセットに対するハッシュテーブル22を作成すると、図34に示すようになる。
同様に、識別番号(データセット番号)が「1」、即ち、CRC値が「1」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「1」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは5)で割った余りの値を算出すると、図35に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「1」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「1」の小規模データセットに対するハッシュテーブル22を作成すると、図36に示すようになる。
また、同様に、識別番号(データセット番号)が「2」、即ち、CRC値が「2」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「2」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは4)で割った余りの値を算出すると、図37に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「2」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「2」の小規模データセットに対するハッシュテーブル22を作成すると、図38に示すようになる。
また、同様に、識別番号(データセット番号)が「3」、即ち、CRC値が「3」の小規模データセットについて、これに含まれる各データのキーに基づいてハッシュ値を算出し、このハッシュ値をこのデータセット番号「3」の小規模データセットに対するハッシュテーブル22のサイズ(ここでは5)で割った余りの値を算出すると、図39に示すようになる。そして、この余りの値が小さい順に、メインメモリ101上のデータセット番号「3」の小規模データセットに対するハッシュテーブル22のハッシュ値に基づいて特定される番地(第1格納位置)又は次の番地(第2格納位置)に格納して、データセット番号「3」の小規模データセットに対するハッシュテーブル22を作成すると、図40に示すようになる。
ところで、この辞書式データ圧縮システムは、データの検索依頼、即ち、データ圧縮のための文字列検索依頼を受けると、以下の手順で、メインメモリ101上の複数のハッシュテーブル22に対してデータ検索(文字列検索)を行なう。
ここでは、検索対象データ(圧縮符号)のキーとして圧縮文字列「aa」を受け取った場合を例に挙げて説明する。
まず、図41に示すように、辞書式データ圧縮システムに備えられるデータ検索装置1のデータ検索処理部3は、ハッシュテーブル特定部12によって、データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュテーブル22の中から、検索対象データのキーに基づいて、検索対象データを含む一のデータセットを格納する一のハッシュテーブル22を特定する。
ここでは、データ検索処理部3は、検索対象データのキーとして圧縮文字列「aa」を受けとったら(ステップG10)、ハッシュテーブル特定部12によって、検索対象データのキーとしての圧縮文字列「aa」のCRC32値を計算し(ステップG20)、算出されたCRC32値(ここでは「0x14429f04」)を小規模データセットの数(ここでは「5」)で割った余りの値(CRC値;ここでは「3」)を算出する(ステップG30)。
次に、データ検索処理部3は、ハッシュ係数値取得部13によって、検索対象データのキーに基づいて、複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応表(図32参照)及び複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値表(図31参照)を用いて、一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得する(ステップG40、G50)。
ここでは、データ検索処理部3は、ハッシュ係数値取得部13によって、上述のようにして検索対象データのキーに基づいて算出したCRC値(ここでは「3」)を使って、CPUキャッシュメモリ111上の対応表(図32参照)を用いて、インデックス番号(ここでは「2」)を取得し(ステップG40)、このインデックス番号(ここでは「2」)を用いて、CPUキャッシュメモリ111上のハッシュ係数値表(図31参照)から、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値(ここではR〜Rの各値)を取得する(ステップG50)。
次に、データ検索処理部3は、ハッシュ値計算部14によって、検索対象データのキー及び一のハッシュ係数の値を用いて一のハッシュ関数によってハッシュ値を計算する(ステップG60)。
ここでは、データ検索処理部3は、ハッシュ値計算部14によって、検索対象データのキー(ここでは圧縮文字列「aa」)、及び、上述のようにして取得した、検索対象データを含むデータセットに対応するハッシュ関数を特定するハッシュ係数の値(ここではR〜Rの各値)を用いて、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれる1つのハッシュ関数によってハッシュ値を計算する(ステップG60)。そして、算出したハッシュ値を、検索対象データを含むデータセットに対するハッシュテーブル22のサイズ(ここでは「5」)で割った余りの値を算出し、この余りの値として「1」を得る(ステップG60)。
次に、データ検索処理部3は、読出部15によって、一のハッシュテーブル22から、ハッシュ値に基づいて特定される第1格納位置及び第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出す(ステップG70)。
ここでは、データ検索処理部3は、読出部15によって、上述のようにして検索対象データのキーに基づいて算出したCRC値(ここでは「3」)によって特定されたハッシュテーブル(3番目のハッシュテーブル)22から、上述のようにして算出したハッシュ値をハッシュテーブル22のサイズで割った余りの値(ここでは「1」)によって特定される番地(第1格納位置;ここでは「1」)及び次の番地(第2格納位置;ここでは「2」)に格納されているデータ及びキーをメインメモリ101から読み出す。
次に、データ検索処理部3は、出力部16によって、第1格納位置又は第2格納位置から読み出したキーが検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを検索対象データとして出力する(ステップG80〜G100)。
ここでは、データ検索処理部3は、出力部16によって、まず、ハッシュ値に基づいて特定される番地(ここでは「1」)から読み出したキー(ここでは「aab」)が、検索対象データのキー(ここでは「aa」)と一致するかを判定し(ステップG80)、次に、ハッシュ値に基づいて特定される番地の次の番地(ここでは「2」)から読み出したキー(ここでは「aa」)が、検索対象データのキー(ここでは「aa」)と一致するかを判定する(ステップG90)。これらの判定の結果、ハッシュ値に基づいて特定される番地の次の番地(ここでは「2」)から読み出したキーが、検索対象データのキーと一致すると判定し、ハッシュ値に基づいて特定される番地の次の番地(ここでは「2」)から読み出したキー(ここでは「aa」)に対応づけられているデータ(ここでは「C」)を得て(ステップG90)、検索対象データである圧縮符号として出力する(ステップG100)。
ところで、上述のデータ検索装置(データ格納方法及びデータ検索方法)をデータ圧縮のための辞書として用いる辞書式データ圧縮システムでは、検索処理時間が検索対象文字列の長さに依存しない性質を利用して、以下のようにして、与えられた文字列の先頭からの最長一致文字列を二分探索手法によって発見する手順と、この手順の逐次的な適用によって、与えられた文字列を圧縮して圧縮符号列を得ることができる。これに対し、Prefix木を用いたものでは、検索処理時間が検索対象文字列の長さに比例するため、先頭からの最長一致文字列が長いケースにおいて、最長一致文字列の発見に要する時間が長くなり、データ圧縮処理時間が長くなってしまう。
ここでは、辞書式データ圧縮システムにおいて、文字列「aabbabb」を圧縮して圧縮符合列を得る場合を例に挙げて説明する。
まず、辞書式データ圧縮システムは、文字列「aabbabb」の圧縮依頼を受け取ると(ステップH10)、まず、文字列「aabb」を、上述のデータ検索装置1に入力する(ステップH20)。そして、上述のデータ検索装置1は、検索対象データ(圧縮符号)のキーとして圧縮文字列「aabb」を受け取ると、上述と同様の処理を行なって、エラーメッセージを出力する。このため、辞書式データ圧縮システムは、文字列「aabb」に対してエラーメッセージを得る(ステップH20)。
次に、辞書式データ圧縮システムは、文字列「aa」を、上述のデータ検索装置1に入力する(ステップH30)。そして、上述のデータ検索装置1は、検索対象データ(圧縮符号)のキーとして圧縮文字列「aa」を受け取ると、上述と同様の処理を行なって、検索対象データである圧縮符号として「C」を出力する。このため、辞書式データ圧縮システムは、文字列「aa」に対して圧縮符号として「C」を得る(ステップH30)。
次に、辞書式データ圧縮システムは、文字列「aab」を、上述のデータ検索装置1に入力する(ステップH40)。そして、上述のデータ検索装置1は、検索対象データ(圧縮符号)のキーとして圧縮文字列「aab」を受け取ると、上述と同様の処理を行なって、検索対象データである圧縮符号として「H」を出力する。このため、辞書式データ圧縮システムは、文字列「aab」に対して圧縮符号として「H」を得る(ステップH40)。
このようにして、圧縮文字列「aabb」に対してエラーメッセージを得て、圧縮文字列「aa」に対して圧縮符号「C」を得て、圧縮文字列「aab」に対して圧縮符号「H」を得た場合、辞書式データ圧縮システムは、辞書中で文字列「aabbabb」の先頭からの最長一致文字列は「aab」であると判定する(ステップH50)。
次に、辞書式データ圧縮システムは、文字列「bab」を、上述のデータ検索装置1に入力する(ステップH60)。そして、上述のデータ検索装置1は、検索対象データ(圧縮符号)のキーとして圧縮文字列「bab」を受け取ると、上述と同様の処理を行なって、検索対象データである圧縮符号として「L」を出力する。このため、辞書式データ圧縮システムは、文字列「bab」に対して圧縮符号として「L」を得る(ステップH60)。
次に、辞書式データ圧縮システムは、文字列「babb」を、上述のデータ検索装置1に入力する(ステップH70)。そして、上述のデータ検索装置1は、検索対象データ(圧縮符号)のキーとして圧縮文字列「babb」を受け取ると、上述と同様の処理を行なって、エラーメッセージを出力する。このため、辞書式データ圧縮システムは、文字列「babb」に対してエラーメッセージを得る(ステップH70)。
このようにして、圧縮文字列「bab」に対して圧縮符号「L」を得て、圧縮文字列「babb」に対してエラーメッセージを得た場合、辞書式データ圧縮システムは、辞書中で文字列「babb」の先頭からの最長一致文字列は「bab」であると判定する(ステップH80)。
次に、辞書式データ圧縮システムは、文字列「b」を、上述のデータ検索装置1に入力する(ステップH90)。そして、上述のデータ検索装置1は、検索対象データ(圧縮符号)のキーとして圧縮文字列「b」を受け取ると、上述と同様の処理を行なって、検索対象データである圧縮符号として「B」を出力する。このため、辞書式データ圧縮システムは、文字列「b」に対して圧縮符号として「B」を得る(ステップH90)。
そして、辞書式データ圧縮システムは、上述のようにして得られた圧縮文字列「aab」に対する圧縮符号「H」、圧縮文字列「bab」に対する圧縮符号「L」、圧縮文字列「b」に対する圧縮符号「B」に基づいて、文字列「aabbabb」を圧縮した圧縮符合列として「HLB」を得て、これを出力する(ステップH100)。
したがって、このような辞書式データ圧縮システムにおいて、上述のデータ検索装置1をデータ圧縮のための辞書として用いることで、データ検索効率の低下をできるだけ抑えながら、データ格納速度やデータ検索速度を向上させることができるという利点がある。例えば、辞書式データ圧縮機能を有するデータベースシステムにおいて、辞書を構成するハッシュテーブル22にアクセスするためのハッシュ値の計算に用いる対応表及びハッシュ係数値表をCPUキャッシュメモリ111上に格納することで、データ圧縮処理を高速化し、ユーザからのデータ更新要求やデータ挿入要求に対する応答性を向上させることができる。
なお、本発明は、上述した実施形態に記載した構成に限定されるものではなく、本発明の趣旨を逸脱しない範囲で種々変形することが可能である。
例えば、上述の実施形態では、データ検索装置を、コンピュータにデータ格納プログラムやデータ検索プログラムをインストールしたものとして構成しているが、上述の実施形態における処理をコンピュータに実行させるデータ格納プログラムやデータ検索プログラム(上述のような機能をコンピュータに実現させるためのデータ格納プログラムやデータ検索プログラム)は、コンピュータ読取可能な記録媒体に格納した状態で提供される場合もある。
ここで、記録媒体には、例えば半導体メモリなどのメモリ,磁気ディスク,光ディスク[例えばCD(Compact Disc)−ROM,DVD(Digital Versatile Disk),ブルーレイディスク等],光磁気ディスク(MO:Magneto optical Disc)等のプログラムを記録することができるものが含まれる。なお、磁気ディスク,光ディスク,光磁気ディスク等を可搬型記録媒体ともいう。
この場合、ドライブ装置を介して、可搬型記録媒体からデータ格納プログラムやデータ検索プログラムを読み出し、読み出されたデータ格納プログラムやデータ検索プログラムを記憶装置にインストールすることになる。これにより、上述の実施形態で説明したデータ検索装置、データ格納方法及びデータ検索方法が実現され、上述の実施形態の場合と同様に、記憶装置にインストールされたデータ格納プログラムやデータ検索プログラムを、CPUがメインメモリ上に読み出して実行することで、上述の実施形態の各処理が行なわれることになる。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。
また、上述の実施形態における処理をコンピュータに実行させるデータ格納プログラムやデータ検索プログラムは、例えば伝送媒体としてのネットワーク(例えばインターネット,公衆回線や専用回線等の通信回線等)を介して提供される場合もある。
例えば、プログラム提供者が例えばサーバなどの他のコンピュータ上で提供しているデータ格納プログラムやデータ検索プログラムを、例えばインターネットやLAN等のネットワーク及び通信インタフェースを介して、記憶装置にインストールしても良い。これにより、上述の実施形態で説明したデータ検索装置、データ格納方法及びデータ検索方法が実現され、上述の実施形態の場合と同様に、記憶装置にインストールされたデータ格納プログラムやデータ検索プログラムを、CPUがメインメモリ上に読み出して実行することで、上述の実施形態の各処理が行なわれることになる。なお、コンピュータは、例えばサーバなどの他のコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
以下、上述の実施形態及び変形例に関し、更に、付記を開示する。
(付記1)
コンピュータに、
データセットを複数のデータセットに分割し、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成し、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行させ、
前記複数のハッシュ関数を決定する処理において、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第1格納位置又は前記第1格納位置に連続する第2格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定する、処理を前記コンピュータに実行させ、
前記複数のハッシュ情報を作成する処理において、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第1格納位置又は前記第2格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成する処理を前記コンピュータに実行させることを特徴とするデータ格納プログラム。
(付記2)
前記対応情報を作成する処理において、キャッシュメモリ上に保持しうる情報量の対応情報を作成する処理を前記コンピュータに実行させ、
前記ハッシュ係数値情報を作成する処理において、キャッシュメモリ上に保持しうる情報量のハッシュ係数値情報を作成する処理を前記コンピュータに実行させることを特徴とする、付記1に記載のデータ格納プログラム。
(付記3)
前記複数のハッシュ関数を決定する処理において、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれるハッシュ関数を前記候補ハッシュ関数として用いることを特徴とする、付記1又は2に記載のデータ格納プログラム。
(付記4)
前記複数のハッシュ関数を決定する処理において、前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットが2つ以上ある場合に、前記候補ハッシュ関数を前記2つ以上のデータセットのそれぞれに対する前記ハッシュ関数として決定する処理を含む処理を前記コンピュータに実行させ、
前記対応情報を作成する処理において、一つのハッシュ関数を特定するハッシュ係数の値と前記2つ以上のデータセットとを対応づけている対応情報を作成する処理を前記コンピュータに実行させることを特徴とする、付記1〜3のいずれか1項に記載のデータ格納プログラム。
(付記5)
前記複数のハッシュ関数を決定する処理において、前記複数のデータセットのそれぞれに対する複数のハッシュ関数として16個又は32個のハッシュ関数を決定する処理を前記コンピュータに実行させ、
前記対応情報を作成する処理において、前記複数のハッシュ関数のそれぞれを特定する前記複数のハッシュ係数の値と前記複数のデータセットとを対応づけ、かつ、4ビット又は5ビットで構成されている複数のインデックスを含む対応情報を作成する処理を前記コンピュータに実行させることを特徴とする、付記1〜4のいずれか1項に記載のデータ格納プログラム。
(付記6)
コンピュータに、
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算し、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第1格納位置及び前記第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出し、
前記第1格納位置又は前記第2格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する、
処理を実行させることを特徴とするデータ検索プログラム。
(付記7)
前記対応情報及び前記ハッシュ係数値情報は、キャッシュメモリ上に保持しうる情報量になっていることを特徴とする、付記6に記載のデータ検索プログラム。
(付記8)
前記複数のハッシュ関数は、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれることを特徴とする、付記6又は7に記載のデータ検索プログラム。
(付記9)
前記対応情報は、一つのハッシュ関数を特定するハッシュ係数の値と2つ以上のデータセットとを対応づけていることを特徴とする、付記6〜8のいずれか1項に記載のデータ検索プログラム。
(付記10)
前記複数のハッシュ関数は、16個又は32個のハッシュ関数であり、
前記対応情報は、前記複数のデータセットと前記複数のハッシュ関数のそれぞれを特定する前記ハッシュ係数の値とを対応づける複数のインデックスを含み、前記複数のインデックスは、それぞれ、4ビット又は5ビットで構成されていることを特徴とする、付記6〜9のいずれか1項に記載のデータ検索プログラム。
(付記11)
データセットを複数のデータセットに分割するデータ分割部と、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定するハッシュ関数決定部と、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成するハッシュ係数値情報作成部と、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成する対応情報作成部と、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成するハッシュ情報作成部とを備え、
前記ハッシュ関数決定部は、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第1格納位置又は前記第1格納位置に連続する第2格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定し、
前記ハッシュ情報作成部は、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第1格納位置又は前記第2格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成することを特徴とするデータ検索装置。
(付記12)
前記対応情報作成部は、キャッシュメモリ上に保持しうる情報量の対応情報を作成し、
前記ハッシュ係数値情報作成部は、キャッシュメモリ上に保持しうる情報量のハッシュ係数値情報を作成することを特徴とする、付記11に記載のデータ検索装置。
(付記13)
前記ハッシュ関数決定部は、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれるハッシュ関数を前記候補ハッシュ関数として用いることを特徴とする、付記11又は12に記載のデータ検索装置。
(付記14)
前記ハッシュ関数決定部は、前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットが2つ以上ある場合に、前記候補ハッシュ関数を前記2つ以上のデータセットのそれぞれに対する前記ハッシュ関数として決定し、
前記対応情報作成部は、一つのハッシュ関数を特定するハッシュ係数の値と前記2つ以上のデータセットとを対応づけている対応情報を作成することを特徴とする、付記11〜13のいずれか1項に記載のデータ検索装置。
(付記15)
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定するハッシュ情報特定部と、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得するハッシュ係数値取得部と、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算するハッシュ値計算部と、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第1格納位置及び前記第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出す読出部と、
前記第1格納位置又は前記第2格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する出力部とを備えることを特徴とするデータ検索装置。
(付記16)
コンピュータが、
データセットを複数のデータセットに分割し、
前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、
前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成し、
前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行し、
前記複数のハッシュ関数を決定する処理において、
前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第1格納位置又は前記第1格納位置に連続する第2格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定する、処理を前記コンピュータが実行し、
前記複数のハッシュ情報を作成する処理において、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第1格納位置又は前記第2格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成する処理を前記コンピュータが実行することを特徴とするデータ格納方法。
(付記17)
前記対応情報を作成する処理において、キャッシュメモリ上に保持しうる情報量の対応情報を作成する処理を前記コンピュータが実行し、
前記ハッシュ係数値情報を作成する処理において、キャッシュメモリ上に保持しうる情報量のハッシュ係数値情報を作成する処理を前記コンピュータが実行することを特徴とする、付記16に記載のデータ格納方法。
(付記18)
前記複数のハッシュ関数を決定する処理において、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれるハッシュ関数を前記候補ハッシュ関数として用いることを特徴とする、付記16又は17に記載のデータ格納方法。
(付記19)
前記複数のハッシュ関数を決定する処理において、前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットが2つ以上ある場合に、前記候補ハッシュ関数を前記2つ以上のデータセットのそれぞれに対する前記ハッシュ関数として決定する処理を含む処理を前記コンピュータが実行し、
前記対応情報を作成する処理において、一つのハッシュ関数を特定するハッシュ係数の値と前記2つ以上のデータセットとを対応づけている対応情報を作成する処理を前記コンピュータが実行することを特徴とする、付記16〜18のいずれか1項に記載のデータ格納方法。
(付記20)
コンピュータが、
データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、
前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、
前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算し、
前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第1格納位置及び前記第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出し、
前記第1格納位置又は前記第2格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する、
処理を実行することを特徴とするデータ検索方法。
1 データ検索装置
2 データ格納処理部
3 データ検索処理部
4 ハッシュ係数値表記憶部(ハッシュ関数実体管理表記憶部)
5 対応表記憶部(ハッシュ関数インデックス表記憶部)
6 ハッシュテーブル記憶部
7 データ分割部
8 ハッシュ関数決定部
9 ハッシュ係数値作成部
10 対応表作成部
11 ハッシュテーブル作成部
12 ハッシュテーブル特定部
13 ハッシュ係数値取得部
14 ハッシュ値計算部
15 読出部
16 出力部
20 ハッシュ係数値表(ハッシュ関数実体管理表)
21 対応表(ハッシュ関数インデックス表)
22 ハッシュテーブル
101 メインメモリ
102 CPU
103 表示制御部
104 表示装置
105 記憶装置
106 入力装置
107 ドライブ装置
108 可搬型記録媒体
109 通信制御部
110 バス
111 キャッシュメモリ(CPUキャッシュメモリ)

Claims (10)

  1. コンピュータに、
    データセットを複数のデータセットに分割し、
    前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、
    前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成し、
    前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成し、
    前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行させ、
    前記複数のハッシュ関数を決定する処理において、
    前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第1格納位置又は前記第1格納位置に連続する第2格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
    前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定する、処理を前記コンピュータに実行させ、
    前記複数のハッシュ情報を作成する処理において、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第1格納位置又は前記第2格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成する処理を前記コンピュータに実行させることを特徴とするデータ格納プログラム。
  2. 前記対応情報を作成する処理において、キャッシュメモリ上に保持しうる情報量の対応情報を作成する処理を前記コンピュータに実行させ、
    前記ハッシュ係数値情報を作成する処理において、キャッシュメモリ上に保持しうる情報量のハッシュ係数値情報を作成する処理を前記コンピュータに実行させることを特徴とする、請求項1に記載のデータ格納プログラム。
  3. 前記複数のハッシュ関数を決定する処理において、データのキー列{x,x,x,...,x}をx(1≦K≦n)として、ハッシュ係数R(1≦R≦256)の値によって特定され、f(x)=f(xK−1)×R+x[但し、f(x)=R(Rは初期値)]で表される関数族に含まれるハッシュ関数を前記候補ハッシュ関数として用いることを特徴とする、請求項1又は2に記載のデータ格納プログラム。
  4. 前記複数のハッシュ関数を決定する処理において、前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットが2つ以上ある場合に、前記候補ハッシュ関数を前記2つ以上のデータセットのそれぞれに対する前記ハッシュ関数として決定する処理を含む処理を前記コンピュータに実行させ、
    前記対応情報を作成する処理において、一つのハッシュ関数を特定するハッシュ係数の値と前記2つ以上のデータセットとを対応づけている対応情報を作成する処理を前記コンピュータに実行させることを特徴とする、請求項1〜3のいずれか1項に記載のデータ格納プログラム。
  5. 前記複数のハッシュ関数を決定する処理において、前記複数のデータセットのそれぞれに対する複数のハッシュ関数として16個又は32個のハッシュ関数を決定する処理を前記コンピュータに実行させ、
    前記対応情報を作成する処理において、前記複数のハッシュ関数のそれぞれを特定する前記複数のハッシュ係数の値と前記複数のデータセットとを対応づけ、かつ、4ビット又は5ビットで構成されている複数のインデックスを含む対応情報を作成する処理を前記コンピュータに実行させることを特徴とする、請求項1〜4のいずれか1項に記載のデータ格納プログラム。
  6. コンピュータに、
    データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、
    前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、
    前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算し、
    前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第1格納位置及び前記第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出し、
    前記第1格納位置又は前記第2格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する、
    処理を実行させることを特徴とするデータ検索プログラム。
  7. データセットを複数のデータセットに分割するデータ分割部と、
    前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定するハッシュ関数決定部と、
    前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を作成するハッシュ係数値情報作成部と、
    前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成する対応情報作成部と、
    前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成するハッシュ情報作成部とを備え、
    前記ハッシュ関数決定部は、
    前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第1格納位置又は前記第1格納位置に連続する第2格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
    前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定し、
    前記ハッシュ情報作成部は、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第1格納位置又は前記第2格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成することを特徴とするデータ検索装置。
  8. データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定するハッシュ情報特定部と、
    前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得するハッシュ係数値取得部と、
    前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算するハッシュ値計算部と、
    前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第1格納位置及び前記第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出す読出部と、
    前記第1格納位置又は前記第2格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する出力部とを備えることを特徴とするデータ検索装置。
  9. コンピュータが、
    データセットを複数のデータセットに分割し、
    前記複数のデータセットのそれぞれに対する複数のハッシュ関数を決定し、
    前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を格納するハッシュ係数値情報を作成し、
    前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値と前記複数のデータセットとを対応づける対応情報を作成し、
    前記複数のデータセットのそれぞれに対する複数のハッシュ情報を作成する、処理を実行し、
    前記複数のハッシュ関数を決定する処理において、
    前記データセット毎に、前記データセットに含まれる複数のデータのそれぞれのキーに基づいて候補ハッシュ関数によってハッシュ値を求め、前記ハッシュ値に基づいて特定される第1格納位置又は前記第1格納位置に連続する第2格納位置に前記複数のデータの全てを格納することができるか否かを判定し、
    前記第1格納位置又は前記第2格納位置に前記複数のデータの全てを格納することができると判定した前記データセットに対する前記ハッシュ関数として前記候補ハッシュ関数を決定する、処理を前記コンピュータが実行し、
    前記複数のハッシュ情報を作成する処理において、前記データセット毎に、前記複数のデータのそれぞれのキーに基づいて前記データセットに対する前記ハッシュ関数によって求められるハッシュ値に基づいて特定される前記第1格納位置又は前記第2格納位置に前記データ及び前記キーを格納して前記データセットに対する前記ハッシュ情報を作成する処理を前記コンピュータが実行することを特徴とするデータ格納方法。
  10. コンピュータが、
    データセットを分割した複数のデータセットをそれぞれ格納する複数のハッシュ情報の中から、検索対象データのキーに基づいて、前記検索対象データを含む一のデータセットを格納する一のハッシュ情報を特定し、
    前記検索対象データのキーに基づいて、前記複数のデータセットと複数のハッシュ関数のそれぞれを特定するハッシュ係数の値とを対応づける対応情報及び前記複数のハッシュ関数のそれぞれを特定する複数のハッシュ係数の値を含むハッシュ係数値情報を用いて、前記一のデータセットに対応する一のハッシュ関数を特定する一のハッシュ係数の値を取得し、
    前記検索対象データのキー及び前記一のハッシュ係数の値を用いて前記一のハッシュ関数によってハッシュ値を計算し、
    前記一のハッシュ情報から、前記ハッシュ値に基づいて特定される第1格納位置及び前記第1格納位置に連続する第2格納位置に格納されているデータ及びキーを読み出し、
    前記第1格納位置又は前記第2格納位置から読み出したキーが前記検索対象データのキーと一致すると判定した場合に、一致すると判定したキーに対応づけられているデータを前記検索対象データとして出力する、
    処理を実行することを特徴とするデータ検索方法。
JP2012288075A 2012-12-28 2012-12-28 データ格納プログラム、データ検索プログラム、データ格納装置、データ検索装置、データ格納方法及びデータ検索方法 Active JP6028567B2 (ja)

Priority Applications (4)

Application Number Priority Date Filing Date Title
JP2012288075A JP6028567B2 (ja) 2012-12-28 2012-12-28 データ格納プログラム、データ検索プログラム、データ格納装置、データ検索装置、データ格納方法及びデータ検索方法
US14/057,784 US9235651B2 (en) 2012-12-28 2013-10-18 Data retrieval apparatus, data storage method and data retrieval method
EP13190257.9A EP2750053B1 (en) 2012-12-28 2013-10-25 Data storage program, data retrieval program, data retrieval apparatus, data storage method and data retrieval method
CN201310739206.1A CN103914506B (zh) 2012-12-28 2013-12-26 数据检索装置、数据存储方法和数据检索方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012288075A JP6028567B2 (ja) 2012-12-28 2012-12-28 データ格納プログラム、データ検索プログラム、データ格納装置、データ検索装置、データ格納方法及びデータ検索方法

Publications (2)

Publication Number Publication Date
JP2014130489A true JP2014130489A (ja) 2014-07-10
JP6028567B2 JP6028567B2 (ja) 2016-11-16

Family

ID=49485593

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012288075A Active JP6028567B2 (ja) 2012-12-28 2012-12-28 データ格納プログラム、データ検索プログラム、データ格納装置、データ検索装置、データ格納方法及びデータ検索方法

Country Status (4)

Country Link
US (1) US9235651B2 (ja)
EP (1) EP2750053B1 (ja)
JP (1) JP6028567B2 (ja)
CN (1) CN103914506B (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101649128B1 (ko) * 2015-03-06 2016-08-19 인하대학교 산학협력단 충돌이 없는 해시 함수를 이용한 빅데이터 분석 방법 및 장치
JP2017526081A (ja) * 2014-08-28 2017-09-07 華為技術有限公司Huawei Technologies Co.,Ltd. 2次元フィルタの生成方法、クエリ方法、及び装置
KR20180015896A (ko) * 2016-08-04 2018-02-14 에스케이하이닉스 주식회사 저항 변화 메모리의 수명 연장 방법 및 그 방법을 이용하는 데이터 저장 시스템
KR20210052148A (ko) * 2019-10-31 2021-05-10 울산과학기술원 데이터 키 값 변환 방법 및 장치

Families Citing this family (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10515231B2 (en) * 2013-11-08 2019-12-24 Symcor Inc. Method of obfuscating relationships between data in database tables
US10078613B1 (en) * 2014-03-05 2018-09-18 Mellanox Technologies, Ltd. Computing in parallel processing environments
US9330104B2 (en) * 2014-04-30 2016-05-03 International Business Machines Corporation Indexing and searching heterogenous data entities
US9443092B2 (en) * 2014-11-18 2016-09-13 Pitney Bowes Inc. System and method for matching data sets while maintaining privacy of each data set
JP6742692B2 (ja) * 2015-01-30 2020-08-19 富士通株式会社 符号化プログラムおよび伸長プログラム
JP6334431B2 (ja) * 2015-02-18 2018-05-30 株式会社日立製作所 データ分析装置、データ分析方法、およびデータ分析プログラム
JP6753401B2 (ja) * 2015-07-24 2020-09-09 富士通株式会社 符号化プログラム、符号化装置、及び符号化方法
CN107229663B (zh) * 2016-03-25 2022-05-27 阿里巴巴集团控股有限公司 数据处理方法和装置以及数据表处理方法和装置
CN106557332A (zh) * 2016-11-30 2017-04-05 上海寒武纪信息科技有限公司 一种指令生成过程的复用方法及装置
CN108874803B (zh) * 2017-05-09 2023-05-12 腾讯科技(深圳)有限公司 数据存储方法、装置及存储介质
US11030714B2 (en) * 2018-01-27 2021-06-08 Microsoft Technology Licensing, Llc. Wide key hash table for a graphics processing unit
US11816103B1 (en) * 2018-03-01 2023-11-14 Amazon Technologies, Inc. Dynamic prefetching for database queries
CN111090397B (zh) * 2019-12-12 2021-10-22 苏州浪潮智能科技有限公司 一种数据重删方法、系统、设备及计算机可读存储介质
US11630864B2 (en) 2020-02-27 2023-04-18 Oracle International Corporation Vectorized queues for shortest-path graph searches
US11222070B2 (en) * 2020-02-27 2022-01-11 Oracle International Corporation Vectorized hash tables
US20210294783A1 (en) * 2020-03-19 2021-09-23 Red Hat, Inc. Scalable Object Storage
CN113465609A (zh) * 2020-03-30 2021-10-01 阿里巴巴集团控股有限公司 一种针对目标对象的时序匹配方法及装置
CN113568561B (zh) * 2020-04-29 2024-05-17 伊姆西Ip控股有限责任公司 用于信息处理的方法、电子设备和计算机存储介质
US11533173B2 (en) * 2020-06-11 2022-12-20 Lognovations Holdings, Llc Systems and methods for compression and encryption of data
CN112165387B (zh) * 2020-09-28 2022-11-08 百行征信有限公司 数据散列值的转换方法、装置及计算机设备
US20220107738A1 (en) * 2020-10-06 2022-04-07 Kioxia Corporation Read controller and input/output controller
CN112417227B (zh) * 2021-01-21 2021-06-01 国能信控互联技术有限公司 一种基于哈希表和红黑树的实时数据存储与查询方法
CN114666011B (zh) * 2022-03-23 2024-04-16 锐捷网络股份有限公司 一种数据处理方法、装置及电子设备

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07168841A (ja) * 1993-12-14 1995-07-04 Shikoku Nippon Denki Software Kk ハッシュテーブル生成方法
US5914938A (en) * 1996-11-19 1999-06-22 Bay Networks, Inc. MAC address table search unit
US20080275847A1 (en) * 2007-05-01 2008-11-06 Microsoft Corporation Scalable minimal perfect hashing
JP2011233014A (ja) * 2010-04-28 2011-11-17 Fujitsu Ltd 検索プログラム、検索装置、および検索方法
JP2012003773A (ja) * 2010-06-21 2012-01-05 Samsung Sds Co Ltd アンチマルウェアデバイス、サーバ及びマルウェアパターンマッチング方法

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3835489B2 (ja) 1996-02-13 2006-10-18 富士通株式会社 データ圧縮装置及び復元装置の辞書検索登録方法
US5893120A (en) * 1997-01-02 1999-04-06 Nemes; Richard Michael Methods and apparatus for information storage and retrieval using a hashing technique with external chaining and on-the-fly removal of expired data
US5897637A (en) * 1997-03-07 1999-04-27 Apple Computer, Inc. System and method for rapidly identifying the existence and location of an item in a file
US6275919B1 (en) * 1998-10-15 2001-08-14 Creative Technology Ltd. Memory storage and retrieval with multiple hashing functions
JP3983987B2 (ja) 2001-03-12 2007-09-26 株式会社東芝 サーバ側プロキシ装置、データ転送方法及びプログラム
US7054912B2 (en) 2001-03-12 2006-05-30 Kabushiki Kaisha Toshiba Data transfer scheme using caching technique for reducing network load
US8238237B2 (en) * 2007-06-18 2012-08-07 Sony Computer Entertainment Inc. Load balancing distribution of data to multiple recipients on a peer-to-peer network
JP5544998B2 (ja) 2010-04-12 2014-07-09 富士通株式会社 テキスト処理装置、テキスト処理方法、およびテキスト処理プログラム
US8365288B2 (en) * 2010-06-21 2013-01-29 Samsung Sds Co., Ltd. Anti-malware device, server, and method of matching malware patterns

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07168841A (ja) * 1993-12-14 1995-07-04 Shikoku Nippon Denki Software Kk ハッシュテーブル生成方法
US5914938A (en) * 1996-11-19 1999-06-22 Bay Networks, Inc. MAC address table search unit
US20080275847A1 (en) * 2007-05-01 2008-11-06 Microsoft Corporation Scalable minimal perfect hashing
JP2011233014A (ja) * 2010-04-28 2011-11-17 Fujitsu Ltd 検索プログラム、検索装置、および検索方法
JP2012003773A (ja) * 2010-06-21 2012-01-05 Samsung Sds Co Ltd アンチマルウェアデバイス、サーバ及びマルウェアパターンマッチング方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JPN6016032133; 青江 順一: 'キー検索技法-I 静的ハッシュ法とその応用' 情報処理 第33巻,第11号, 19921115, p.1359-1366, 社団法人情報処理学会 *

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2017526081A (ja) * 2014-08-28 2017-09-07 華為技術有限公司Huawei Technologies Co.,Ltd. 2次元フィルタの生成方法、クエリ方法、及び装置
KR101649128B1 (ko) * 2015-03-06 2016-08-19 인하대학교 산학협력단 충돌이 없는 해시 함수를 이용한 빅데이터 분석 방법 및 장치
KR20180015896A (ko) * 2016-08-04 2018-02-14 에스케이하이닉스 주식회사 저항 변화 메모리의 수명 연장 방법 및 그 방법을 이용하는 데이터 저장 시스템
KR102565005B1 (ko) 2016-08-04 2023-08-07 에스케이하이닉스 주식회사 저항 변화 메모리의 수명 연장 방법 및 그 방법을 이용하는 데이터 저장 시스템
KR20210052148A (ko) * 2019-10-31 2021-05-10 울산과학기술원 데이터 키 값 변환 방법 및 장치
KR102388458B1 (ko) * 2019-10-31 2022-04-21 울산과학기술원 데이터 키 값 변환 방법 및 장치

Also Published As

Publication number Publication date
CN103914506A (zh) 2014-07-09
US9235651B2 (en) 2016-01-12
EP2750053A1 (en) 2014-07-02
JP6028567B2 (ja) 2016-11-16
EP2750053B1 (en) 2019-03-06
US20140188893A1 (en) 2014-07-03
CN103914506B (zh) 2017-09-12

Similar Documents

Publication Publication Date Title
JP6028567B2 (ja) データ格納プログラム、データ検索プログラム、データ格納装置、データ検索装置、データ格納方法及びデータ検索方法
KR101467589B1 (ko) 데이터 구조를 가지는 하나 이상의 장치 판독가능 매체, 및장치 실행가능 명령어를 구비한 하나 이상의 장치 판독가능 매체
US8051032B2 (en) System and method for loading records into a partitioned database table
US9405782B2 (en) Parallel operation in B+ trees
CN103914483B (zh) 文件存储方法、装置及文件读取方法、装置
CN103353901B (zh) 基于Hadoop分布式文件系统的表数据的有序管理方法以及系统
JP5844824B2 (ja) Sparqlクエリ最適化方法
KR20140038441A (ko) 압축 매치 열거 기법
CN108304384B (zh) 拆词方法及设备
JPWO2019073967A1 (ja) k−匿名化装置、方法及びプログラム
JP2012221489A (ja) 効率的にクエリを処理する方法及び装置
JP2010072823A (ja) データベース管理システムおよびプログラム
US10339104B2 (en) Information processing apparatus, file management method, and computer-readable recording medium having stored therein file management program
KR100859710B1 (ko) 데이터에 대한 검색을 수행하기 위한 자료구조를 이용하여 데이터를 검색, 저장, 삭제하는 방법
JPWO2016043121A1 (ja) 情報処理装置、情報処理方法、及びプログラム
EP3995972A1 (en) Metadata processing method and apparatus, and computer-readable storage medium
JP5736589B2 (ja) 数列データ検索装置、数列データ検索方法及びプログラム
JP2011257877A (ja) 情報検索装置、情報検索方法、及びプログラム
US20110029570A1 (en) Systems and methods for contextualized caching strategies
JPWO2013172309A1 (ja) ルール発見システムと方法と装置並びにプログラム
CN109815225B (zh) 基于前缀树结构的并行化前缀数据检索方法和系统
CN106777131A (zh) 一种高维空间数据的查询方法、装置及计算机可读介质
JP2009175896A (ja) 情報検索装置及び方法及びプログラム及びコンピュータ読取可能な記録媒体
JP2010191624A (ja) 情報検索方法とその装置、プログラム、記録媒体
JP6631139B2 (ja) 検索制御プログラム、検索制御方法および検索サーバ装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150903

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160729

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160823

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160830

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160920

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20161003

R150 Certificate of patent or registration of utility model

Ref document number: 6028567

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150