(57)【特許請求の範囲】
【請求項１】
データと、keyと前記keyに対応するvalueが格納される第１のメモリと、
前記keyと前記valueが格納される第２のメモリと、
前記第１のメモリ及び前記第２のメモリを制御する制御回路と、
前記制御回路と前記第１のメモリとの間に接続されたメモリコントローラとを具備し、
前記メモリコントローラはダイレクトメモリアクセス（ＤＭＡ）回路を有し、
前記ダイレクトメモリアクセス回路は、前記制御回路を介さずに前記第１のメモリと前記第２のメモリを制御し、
前記keyと前記valueは、第１のアドレスと、第１key及び前記第１keyに対応する第１valueとを有し、前記第１key及び前記第１valueは前記第１のアドレスに記憶され、第２のアドレスは前記第１valueに記憶され、
前記第２のアドレスにより指定された前記第１のメモリ内の記憶場所を参照することにより、第２valueを得るメモリ。
【請求項２】
前記第１keyの入力に対して、ハッシュ関数によって前記第１key及び前記第１valueが記憶された前記第１のアドレスを生成するハッシュ生成器をさらに具備する請求項１に記載のメモリ。
【請求項３】
前記第１のメモリはＤＲＡＭである請求項１または２に記載のメモリ。
【請求項４】
前記第１のメモリは、前記第１keyの入力に対して、前記第１keyと、前記第１のメモリ内に格納されたデータとの比較を行い、一致したデータが記憶された第３のアドレスを出力する連想メモリ(Content-addressable memory:ＣＡＭ)と、
前記第３のアドレスの指定により書き込み及び読み出しが行われるＲＡＭとを備える請求項１に記載のメモリ。
【請求項５】
前記第２のメモリは、前記制御回路により制御されるメインメモリである請求項１乃至４のいずれかに記載のメモリ。
【請求項６】
前記メインメモリはＤＲＡＭである請求項５に記載のメモリ。
【請求項７】
前記第２のメモリは、前記第１keyの入力に対して、前記第１keyと、前記第２のメモリ内に格納されたデータとの比較を行い、一致したデータが記憶された第３のアドレスを出力するコンテンツ連想メモリ(ＣＡＭ)と、
前記第３のアドレスの指定により書き込み及び読み出しが行われるＲＡＭとを備える請求項１乃至４のいずれかに記載のメモリ。
【請求項８】
前記第２のメモリはＮＡＮＤ型フラッシュメモリである請求項７に記載のメモリ。
【請求項９】
前記制御回路は、前記keyと前記valueに基づく要求に応じて前記第１のメモリに格納された前記keyと前記valueの記憶容量を可変する請求項１乃至８のいずれかに記載のメモリ。
【請求項１０】
前記制御回路は、バスを介して第１、第２のメモリに接続されたＣＰＵである請求項１乃至９のいずれかに記載のメモリ。
【請求項１１】
前記制御回路は、前記第１のメモリに格納された前記key及び前記valueと、前記２のメモリに格納された前記key及び前記valueとを用いて、ＡＮＤ、ＯＲ、及びＮＯＴのいずれかの集合演算を行う請求項１乃至１０のいずれかに記載のメモリ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、ホストシステムによりアクセスされる、メモリ、データ処理方法、及びメモリシステムに関する。
【背景技術】
【０００２】
近年のメモリシステムを備えた一般のコンピュータシステムでは、多くのデータ操作、特に、データ集合を取り扱う操作が頻発している。例えば、全文検索システム等で、ＡとＢの二つのキーワードを含むデータを探し出したいといった操作は、Ａを含むデータの集合とＢを含むデータの集合との積集合を求めることに他ならない。
【０００３】
一般のコンピュータシステムにおいて、最も広く用いられているのは、データをアドレスによって管理するメモリシステムである。このようなデータの取り扱いだと、データとアドレスを１対１で管理することになり、先のようなデータ集合を扱うためには、一般に複雑なアルゴリズムに基づいたソフトウェア処理が必須となる。
【０００４】
一方で、データをアドレスではなく、その内容そのもので管理するメモリシステムも存在する。ところが、これらは特殊用途に用いられることはあっても、コストや既存システムとの互換性などの観点から、一般のコンピュータシステムに用いられることはまれであった。
【０００５】
従来のコンピュータシステムでは、データ集合の演算を行おうとした場合、そのメモリシステム上の制約から、複雑なソフトウェア処理が必要となり、性能の劣化や取扱いにくさといった課題があった。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００５−２０９２１４号公報
【特許文献２】特許第４１６７３５９号
【発明の概要】
【発明が解決しようとする課題】
【０００７】
全文検索システム等で多発する集合演算に係るシステム負荷を著しく低減でき、さらに集合演算を高速に行うことが可能なメモリ、データ処理方法、及びメモリシステムを提供する。
【課題を解決するための手段】
【０００８】
一実施態様のメモリは、データと、keyと前記keyに対応するvalueが格納される第１のメモリと、前記keyと前記valueが格納される第２のメモリと、前記第１のメモリ及び前記第２のメモリを制御する制御回路と、前記制御回路と前記第１のメモリとの間に接続されたメモリコントローラとを具備する。前記メモリコントローラはダイレクトメモリアクセス（ＤＭＡ）回路を有し、前記ダイレクトメモリアクセス回路は、前記制御回路を介さずに前記第１のメモリと前記第２のメモリを制御する。前記keyと前記valueは、第１のアドレスと、第１key及び前記第１keyに対応する第１valueとを有し、前記第１key及び前記第１valueは前記第１のアドレスに記憶され、第２のアドレスは前記第１valueに記憶され、前記第２のアドレスにより指定された前記第１のメモリ内の記憶場所を参照することにより、第２valueを得る。
【図面の簡単な説明】
【０００９】
【図１】実施形態に用いられるＫＶＳメモリの第１構成例を示す図である。
【図２】実施形態に用いられるＫＶＳメモリの第２構成例を示す図である。
【図３】第１実施形態のメモリシステムのハードウェア構成を示すブロック図である。
【図４】第１実施形態のメインメモリにおけるデータ領域の構成例を示す図である。
【図５】第１実施形態におけるＡＮＤ演算の動作を示すフローチャートである。
【図６】第１実施形態におけるＯＲ演算の動作を示すフローチャートである。
【図７】第１実施形態におけるＮＯＴ演算の動作を示すフローチャートである。
【図８】第１実施形態における変形例１のメモリシステムのハードウェア構成を示すブロック図である。
【図９】第１実施形態における変形例２のメモリシステムのハードウェア構成を示すブロック図である。
【図１０】第１実施形態における変形例３のメモリシステムのハードウェア構成を示すブロック図である。
【図１１】第２実施形態のメモリシステムのハードウェア構成を示すブロック図である。
【図１２】第２実施形態における変形例１のメモリシステムのハードウェア構成を示すブロック図である。
【図１３】第２実施形態における変形例２のメモリシステムのハードウェア構成を示すブロック図である。
【発明を実施するための形態】
【００１０】
以下の説明において、同一の機能及び構成を有する構成要素については、同一符号を付し、重複説明は必要な場合にのみ行う。
【００１１】
本実施形態に係る、集合演算が可能なメモリシステム（検索メモリ）は、少なくとも１つのkey-valueストア機能（以下、ＫＶＳと記す）を有するメモリを備えている。ＫＶＳとは、キー（key）と値（value）の組を書き込み、キーを指定することで値を読み出せるデータベース管理方式のことを意味する。ＫＶＳでは、データはkeyとkeyに対応するvalueの組であるkey-value型データとして管理され、検索要求としてkeyが与えられると、それに対応付けられていたvalueを出力することが可能である。ここでは、このようなＫＶＳを有するメモリを、以降、ＫＶＳメモリと記す。
【００１２】
以下に、ＫＶＳメモリ及びその命令について詳しく説明する。
【００１３】
ＫＶＳメモリは通常のメモリアクセスの命令に加え、少なくともGET、PUT、DELETEなどのＫＶＳ命令を備えたメモリであり、各命令の意味は次の通りである。
【００１４】
（１）GET(key, value)：要素(value)が指定されなかった(NULL)場合は、keyに対応するデータ集合を得る。要素(value)が指定された場合は、データ集合の中にvalueが存在したらvalueそのもの、あるいはTRUEを返す。データ集合の中にvalueが存在しなかったら、空集合(NULL)あるいはFALSEを返す。keyに対応するデータ集合が無い場合も、空集合(NULL)あるいはFALSEを返す。
【００１５】
（２）PUT(key, value)：keyに対応するデータ集合に要素(value)を追加する。要素がデータ集合中に既に存在する場合は何もしない。
【００１６】
（３）DELETE(key, value)：keyに対応するデータ集合から要素(value)を削除する。要素がデータ集合中に存在しなければ何もしない。
【００１７】
以下に、ＫＶＳメモリの具体的な構成例と動作例を示す。  
図１は、実施形態に用いられるＫＶＳメモリの第１構成例を示す図である。  
図示するように、ＫＶＳメモリ１４には、例えば、メモリコントローラ１３及びハッシュ生成器１６が接続されている。さらに、メモリコントローラ１３には、上位システム１００が接続されている。ハッシュ生成器１６は、任意長のデータを固定長のビット列に変換する、いわゆるハッシュ関数の機能を持つ。上位システム１００は、例えば、中央演算処理装置（ＣＰＵ）及びメインメモリ等を備えたホストシステムである。
【００１８】
ＫＶＳメモリ１４には、例えばＤＲＡＭ等の汎用メモリが用いられる。ＫＶＳメモリ１４は、少なくともハッシュテーブル領域１４Ａと実データ領域１４Ｂの２つの記憶領域に分けられる。これらの記憶領域は複数持つことができるが、ハッシュテーブル領域１４Ａのサイズは、ハッシュ生成器１６が生成するハッシュ値(固定長ビットデータ)が表現できるサイズよりも大きい。ハッシュテーブル領域１４Ａは、keyの実アドレスを記憶できる領域とvalueの実アドレスを記憶できる領域とに分けられる。ハッシュテーブル領域１４Ａの記憶容量は、固定されているわけではなく、key-valueストアに基づく要求に応じて可変（拡張あるいは縮小）することができる。また、実データ領域１４Ｂにはデータが記憶される。
【００１９】
メモリコントローラ１３は、上位システム１００から受け取ったＫＶＳ命令を解釈し、ＫＶＳメモリ１４及びハッシュ生成器１６に対して、次に述べるような動作を行う。
【００２０】
いま、animalというkeyがＫＶＳメモリ１４中にまだ存在しない場合を考える。ここで、PUT(animal, dog)、PUT(animal, cat)という命令をメモリコントローラ１３が順に受け取ると、ハッシュ生成器１６によって、animal、dog、catのそれぞれに対応するハッシュ値が生成される。これらが順に、158、98、188という固定長のビット列だったとする。
【００２１】
ここで、ハッシュテーブル領域１４Ａ中のハッシュ値に対応するアドレスの内容が調べられ、animalというkeyが既にストアされているかどうかを調べる。ここではまだ存在していないため（値が0なので）、それぞれの実データを記憶するための領域が確保され(1020, 1055, 1090)、これらの先頭アドレスがハッシュテーブル領域１４Ａのkey領域に記憶される。確保された領域(1020, 1055, 1090)には、animal、dog、cat等の実データが記憶される。
【００２２】
さらに、animalというkeyとデータ集合{dog, cat}とを関連付けるため、実データ領域１４Ｂに各要素用の領域を確保し、その先頭アドレス(1100)をハッシュテーブル領域１４Ａのanimalに相当するvalue領域に書き込む。そして、各要素の先頭アドレスを書き並べたもの（1055, 1090）が実データ領域１４Ｂ中に記憶される。
【００２３】
これで、ＫＶＳメモリ１４内にanimalというkeyに対応するデータ集合{dog, cat}が作られたことになる。図１には、このときのＫＶＳメモリ１４内の状態が示されている。
【００２４】
次に、GET(animal, NULL)という命令をメモリコントローラ１３が受け取ったとすると、ハッシュテーブル領域１４Ａのanimalのハッシュ値であるアドレス(0158)に書かれたvalue領域(1100)の中身（要素の実データの先頭アドレス）から実データが読み出される。すなわち{dog, cat}が上位システム１００に出力される。
【００２５】
もしここで、命令がGET(animal, dog)である場合は、メモリコントローラ１３は各要素を出力せずに、第二引数であるdogと一致する要素があったときだけ、dogまたはTRUEを上位システム１００に出力する。また、命令がGET(animal, lion)である場合は、一致する要素がないため、NULLまたはFALSEを上位システム１００に出力する。
【００２６】
さらに、DELETE(animal, dog)という命令をメモリコントローラ１３が受け取ると、animalに対応するデータ集合よりdogが削除される。具体的には、アドレス(1100)から始まる各要素が調べられ、dogを除いた残り(1090)が値として書き込まれる。あるいは、このとき、新たに実データ領域１４Ｂ中に確保されたメモリ領域にdogを除いた要素を順に書き出して行き、最後にハッシュテーブル領域１４Ａのanimalのvalue領域を書き換え、元のアドレス(1100)を開放する、というやり方もある。
【００２７】
なお、DELETEの際、dogの要素そのものがanimal以外の集合に属していない場合に、dogという要素が使用しているメモリを開放する（ガベージコレクション）という動作が伴う場合がある。
【００２８】
ここで、命令がGET(animal, NULL)である場合、{cat}が上位システム１００に返される。さらに、命令がDELETE(animal, cat)である場合、ハッシュテーブル領域１４Ａ内のanimalのkey領域、value領域が開放され、animalというkeyに対応するデータ集合は無くなる。すなわち、命令がGET(animal, NULL)である場合、空集合(NULL)が上位システム１００に返される。
【００２９】
また、ＫＶＳメモリの構成例としては上記のほかにもいくつかの実現方法がある。具体的には、図１に示した構成において、ハッシュテーブル領域１４Ａを連想メモリ（ＣＡＭ：Content-Addressable Memory）を用いて構成する方法を以下に説明する。
【００３０】
図２は、実施形態に用いられるＫＶＳメモリの第２構成例を示す図である。  
本構成例は，ＫＶＳメモリとしてのＣＡＭ−ＲＡＭ１４２と、上位システム１００から入力されたＫＶＳ命令を解釈し、ＣＡＭ−ＲＡＭ１４２及び他のモジュールを制御するメモリコントローラ１３とを備える。
【００３１】
ＣＡＭ−ＲＡＭ１４２は、テーブル領域としてのＣＡＭ部１４２Ａと、データ領域としてのＲＡＭ(random access memory)部１４２Ｂとを有する。ＲＡＭ部１４２Ｂには、ＤＲＡＭやＮＡＮＤ型フラッシュメモリなどの汎用メモリを用いることができる。連想メモリ（ＣＡＭ部）にはいくつか種類があるが、ここではＣＡＭ部１４２Ａに、アドレスを介した通常の読み書きに加え、入力されたデータ(key)がＣＡＭ中に含まれていた場合に固定長のデータ(value)を返す種類のＣＡＭを用いる。すなわち、ＣＡＭ部１４２Ａは、データ(key)の入力に対して、そのデータと全ての格納データとの一致・不一致の比較演算を同時並列に行い、一致した格納データのvalueを出力する機能を持つ。
【００３２】
ＣＡＭ−ＲＡＭとは、コンテンツ連想メモリ（ＣＡＭ）でアドレスを出力させ、アドレス指定アクセスのＲＡＭでデータを出力させるように組み合わせたシステムである。ＣＡＭ−ＲＡＭでは、ハッシュ値を介さずに、keyとvalueを直接読み書きできるため、図１に示した構成例と比べてハッシュ生成器１６が不要となる。
【００３３】
次に、第２構成例でのＫＶＳ命令の動作について説明する。  
いま、animal、dog、catというkeyがＣＡＭ部１４２Ａにまだ存在しない場合を考える。ここで、PUT(animal, dog)、PUT(animal, cat)という命令をメモリコントローラ１３が順に受け取ると、keyがＣＡＭ部１４２Ａに既にストアされているかどうかを調べる。ここではまだ存在していないため、それぞれのkeyをＣＡＭ部１４２Ａにストアする。そして、ＣＡＭ部中の各要素(dog, cat)のvalue(ここでは先頭アドレスの1055, 1090)をＲＡＭ部１４２Ｂに記憶領域を確保して、集合としてストアする。さらに、この集合の先頭アドレス(1100)をＣＡＭ部１４２Ａのkey(animal)のvalueとしてストアする。
【００３４】
このとき、前記の集合はＣＡＭ部中にストアすることもできるが、一般にＣＡＭはＲＡＭに比べてビットあたりのコストが高いため、上記のような実現方法を用いたほうがよい。図２には、このときのＣＡＭ−ＲＡＭ１４２内の状態が示されている。
【００３５】
次に、GET(animal, NULL)という命令をメモリコントローラ１３が受け取ったとすると、ＣＡＭ部１４２Ａのanimal(key)に対するvalueである1100をＲＡＭ部１４２Ｂのアドレスと読み替えたときに、集合{1055, 1090}が読み出せ、さらに集合{1055, 1090}をＣＡＭ部１４２Ａのアドレスとして読み替えたkey領域、すなわち{dog, cat}が上位システム１００に出力される。
【００３６】
もしここで、命令がGET(animal, dog)である場合、メモリコントローラ１３は各要素を出力せずに，第二引数であるdogと一致する要素があったときだけ、dogまたはTRUEを上位システム１００に出力する。また、命令がGET(animal, lion)である場合は、一致する要素がないため、NULLまたはFALSEを上位システム１００に出力する。
【００３７】
さらに、DELETE(animal, dog)という命令をメモリコントローラ１３が受け取ると，animalに対応するデータ集合よりdogが削除される．具体的には、アドレス(1100)から始まる各要素が調べられ、dogを除いた残り(1090)が値として書き込まれる。あるいは、このとき、新たにＲＡＭ部中に確保されたメモリ領域にdogを除いた要素を順に書き出して行き、最後にＣＡＭ部１４２Ａのanimalのvalue領域を書き換え、元のアドレス(1100)を開放する、というやり方もある。
【００３８】
なお、DELETEの際、dogの要素そのものがanimal以外の集合に属していない場合に、dogという要素が使用しているメモリを開放する（ガベージコレクション）という動作が伴う場合がある。
【００３９】
ここで、命令がGET(animal, NULL)である場合、{cat}が上位システム１００に返される。さらに、命令がDELETE(animal, cat)である場合、ＣＡＭ部１４２Ａ内のanimalのkey領域、 value領域が開放され、animalというkeyに対応するデータ集合は無くなる。すなわち、GET(animal, NULL)の場合、空集合(NULL)が上位システム１００に返される。
【００４０】
［第１実施形態］  
［１］ハードウェア構成
まず、第１実施形態のメモリシステムのハードウェア構成について説明する。  
図３は、第１実施形態のメモリシステムのハードウェア構成を示すブロック図である。  
図示するように、メモリシステムは、ＣＰＵ１１、メインメモリ１２、メモリコントローラ１３、及びＫＶＳメモリ１４を備える。さらに、ＣＰＵ１１、メインメモリ１２、及びメモリコントローラ１３の間は、バス１５にて接続されている。
【００４１】
ＣＰＵ１１は、メインメモリ１２、メモリコントローラ１３、及びＫＶＳメモリ１４を制御し、後述する集合演算を行う。メモリコントローラ１３は、ＫＶＳメモリ１４及びその他のメモリ（図示しない）を制御する。メモリコントローラ１３は、ダイレクトメモリアクセス（ＤＭＡ：Direct Memory Access）機能を持つ回路を有する。ＤＭＡ機能を用いれば、メモリコントローラ１３とメインメモリ１２との間のデータ転送を、ＣＰＵ１１を介さずに、直接制御することができる。
【００４２】
ＫＶＳメモリ１４は、図１または図２に示したようなデータ領域を格納している。ＫＶＳメモリ１４の構成及び動作は、図１または図２を用いて説明した通りであり、その説明は省略する。
【００４３】
また、図４はメインメモリ１２におけるデータ領域の構成例を示す。ＣＰＵ１１とメインメモリ１２は、key-valueストア（ＫＶＳ）を有するメモリを構成する。例えば、ＣＰＵ１１がハッシュ値を生成する機能を有する場合、図４に示すように、メインメモリ１２はハッシュテーブル領域１２Ａと実データ領域１２Ｂとを有する。また、メインメモリ１２は、主記憶としてデータや命令コードを記憶する。
【００４４】
［２］集合演算
次に、第１実施形態のメモリシステムにおける集合演算について説明する。
【００４５】
いま、ＫＶＳメモリ１４中に、animal = {dog, tuna, cat}と、fish = {porgy, tuna, salmon}という２つのデータ集合がストアされていたとする。以下に、ＡＮＤ演算、ＯＲ演算、及びＮＯＴ演算の動作を述べる。
【００４６】
（１）ＡＮＤ演算  
図５は、第１実施形態におけるＡＮＤ演算の動作を示すフローチャートである。  
具体的な例として、animal AND fishという演算を行う場合の処理を示す。まず、ＣＰＵ１１はメモリコントローラ１３を介してＫＶＳメモリ１４に対して、GET(animal, NULL)という命令を発行する（ステップＳ１）。続いて、ＣＰＵ１１は、GET(animal, NULL)の命令に対して、ＫＶＳメモリ１４から出力されたデータ集合を前述したＫＶＳ命令の動作と同様に（ハッシュ関数等をソフトウェア的に処理して）、answer集合としてメインメモリ１２に記憶させる。すなわち、ＣＰＵ１１はメインメモリ１２に対して、PUT(answer, dog)、PUT(answer, tuna)、PUT(answer, cat)という命令を発行する。この結果、answer = {dog, tuna, cat}という集合がメインメモリ１２に記憶される（ステップＳ２）。これにより、メインメモリ１２はkey-value型データを有するメモリとして機能する。すなわち、メインメモリ１２には、keyとしてのanswerとvalueとしての{dog, tuna, cat}のペアが記憶される。
【００４７】
次に、ＣＰＵ１１は、メインメモリ１２中のanswer集合の中の各要素が、ＫＶＳメモリ１４内のfish集合の中に存在するかどうか調べる。最初は、ＣＰＵ１１がＫＶＳメモリ１４に対して、GET(fish, dog)という命令を発行する（ステップＳ３）。この返り値はFALSEであるため、ＣＰＵ１１はメインメモリ１２中のanswer集合の中の要素dogを削除する。すなわち、ＣＰＵ１１はメインメモリ１２に対して、DELETE(answer, dog)の命令を発行する（ステップＳ４）。
【００４８】
続いて、ＣＰＵ１１は、メインメモリ１２中のanswer集合の中の全ての要素の処理が終了したかを判定する（ステップＳ５）。ここでは、answer集合の中の全ての要素の処理が終了していないため、ステップＳ３に戻り、ステップＳ３以降の処理を繰り返す。
【００４９】
ＣＰＵ１１は、ＫＶＳメモリ１４中のfish集合の中からtunaを探す。すなわち、ＣＰＵ１１はＫＶＳメモリ１４に対して、GET(fish, tuna)という命令を発行する（ステップＳ３）。すると、この返り値はTRUEであるため、次に進む。
【００５０】
catについても同様に、ＣＰＵ１１はＫＶＳメモリ１４中のfish集合の中からcatを探す。すなわち、ＣＰＵ１１はＫＶＳメモリ１４に対して、GET(fish, cat)という命令を発行する（ステップＳ３）。すると、この返り値はFALSEであるため、ＣＰＵ１１はメインメモリ１２中のanswer集合の中の要素catを削除する。すなわち、ＣＰＵ１１はメインメモリ１２に対して、DELETE(answer, cat)の命令を発行する（ステップＳ４）。
【００５１】
ステップＳ５において、answer集合の中の全ての要素の処理が終了すると、結果として、メインメモリ１２中のanswer集合はanswer = {tuna}となり、ＡＮＤ演算の解となる（ステップＳ６）。
【００５２】
なお、answerと別の名前の解集合を用意すれば、同時に複数のＡＮＤ演算を行うことも可能である。
【００５３】
（２）ＯＲ演算  
図６は、第１実施形態におけるＯＲ演算の動作を示すフローチャートである。  
具体的な例として、animal OR fishという演算を行う場合の処理を示す。まず、ＣＰＵ１１はメモリコントローラ１３を介してＫＶＳメモリ１４に対して、GET(animal, NULL)という命令を発行する（ステップＳ１１）。続いて、GET(animal, NULL)の命令に対して、ＫＶＳメモリ１４から出力されたデータ集合を、ＣＰＵ１１はanswer集合としてメインメモリ１２に記憶させる。すなわち、ＣＰＵ１１はメインメモリ１２に対して、PUT(answer, dog)、PUT(answer, tuna)、PUT(answer, cat)という命令を発行する。この結果、answer = {dog, tuna, cat}という集合がメインメモリ１２に記憶される（ステップＳ１２）。これにより、メインメモリ１２はkey-value型データを有するメモリとして機能する。すなわち、メインメモリ１２には、keyとしてのanswerとvalueとしての{dog, tuna, cat}のペアが記憶される。
【００５４】
次に、ＣＰＵ１１は、ＫＶＳメモリ１４中のfish集合の中の各要素がメインメモリ１２中のanswer集合の中に存在するかどうかを調べる。最初は、ＣＰＵ１１がメインメモリ１２に対して、GET(answer, porgy)という命令を発行する（ステップＳ１３）。この返り値はFALSEであるため、ＣＰＵ１１はporgyをメインメモリ１２中のanswer集合に入れる。すなわち、ＣＰＵ１１はメインメモリ１２に対して、PUT(answer, porgy)の命令を発行する（ステップＳ１４）。
【００５５】
続いて、ＣＰＵ１１は、ＫＶＳメモリ１４中のfish集合の中の全ての要素の処理が終了したかを判定する（ステップＳ１５）。ここでは、fish集合の中の全ての要素の処理が終了していないため、ステップＳ１３に戻り、ステップＳ１３以降の処理を繰り返す。
【００５６】
ＣＰＵ１１は、ＫＶＳメモリ１４中のfish集合の中のtunaがメインメモリ１２中のanswer集合の中に存在するかどうかを調べる。すなわち、ＣＰＵ１１はメインメモリ１２に対して、GET(answer, tuna)という命令を発行する（ステップＳ１３）。すると、返り値はTRUEであるため、次に進む。
【００５７】
salmonについても同様に、ＣＰＵ１１はfish集合の中のsalmonがメインメモリ１２中のanswer集合の中に存在するかどうかを調べる。すなわち、ＣＰＵ１１はメインメモリ１２に対して、GET(answer, salmon)という命令を発行する（ステップＳ１５）。すると、この返り値はFALSEであるため、ＣＰＵ１１はsalmonをメインメモリ１２中のanswer集合に入れる。すなわち、ＣＰＵ１１はメインメモリ１２に対して、PUT(answer, salmon)の命令を発行する（ステップＳ１４）。
【００５８】
ステップＳ１５において、fish集合の中の全ての要素の処理が終了すると、結果として、メインメモリ１２中のanswer集合はanswer = {dog, tuna, cat, porgy, salmon}となり、ＯＲ演算の解となる（ステップＳ１６）。
【００５９】
なお、answerと別の名前の解集合を用意すれば、同時に複数のＯＲ演算を行うことも可能である。
【００６０】
（３）ＮＯＴ演算  
図７は、第１実施形態におけるＮＯＴ演算の動作を示すフローチャートである。  
具体的な例として、animal NOT fishという演算を行う場合の処理を示す。まず、ＣＰＵ１１はメモリコントローラ１３を介してＫＶＳメモリ１４に対して、GET(animal, NULL)という命令を発行する（ステップＳ２１）。続いて、GET(animal, NULL)の命令に対して、ＫＶＳメモリ１４から出力されたデータ集合を、ＣＰＵ１１はanswer集合としてメインメモリ１２に記憶させる。すなわち、ＣＰＵ１１はメインメモリ１２に対して、PUT(answer, dog)、PUT(answer, tuna)、PUT(answer, cat)という命令を発行する。この結果、answer = {dog, tuna, cat}という集合がメインメモリ１２に記憶される（ステップＳ２２）。これにより、メインメモリ１２はkey-value型データを有するメモリとして機能する。すなわち、メインメモリ１２には、keyとしてのanswerとvalueとしての{dog, tuna, cat}のペアが記憶される。
【００６１】
次に、ＣＰＵ１１は、ＫＶＳメモリ１４中のfish集合の中の各要素を、メインメモリ１２中のanswer集合から削除する。最初は、ＣＰＵ１１がメインメモリ１２に対して、DELETE(answer, porgy)という命令を発行する（ステップＳ２３）。
【００６２】
続いて、ＣＰＵ１１は、ＫＶＳメモリ１４中のfish集合の中の全ての要素の処理が終了したかを判定する（ステップＳ２４）。ここでは、fish集合の中の全ての要素の処理が終了していないため、ステップＳ２３に戻り、ステップＳ２３以降の処理を繰り返す。
【００６３】
ＣＰＵ１１は、ＫＶＳメモリ１４中のfish集合の中のtuna, salmonについても同様に、メインメモリ１２中のanswer集合から削除する（ステップＳ２３）。
【００６４】
ステップＳ２４において、fish集合の中の全ての要素の処理が終了すると、結果として、メインメモリ１２中のanswer集合はanswer = {dog, cat}となり、ＮＯＴ演算の解となる（ステップＳ２５）。
【００６５】
なお、answerと別の名前の解集合を用意すれば、同時に複数のＮＯＴ演算を行うことも可能である。
【００６６】
また、前述したＣＰＵ１１が行っている作業は、メモリコントローラ１３が有するダイレクトメモリアクセス（ＤＭＡ）機能によりすべて実行することができる。ＣＰＵ１１が行っている作業を、メモリコントローラ１３のＤＭＡ機能によって全て行うことにより、ＣＰＵ１１に負荷をかけることなく、前述の集合演算を行うことが可能である。
【００６７】
［３］変形例１  
図８は、第１実施形態における変形例１のメモリシステムのハードウェア構成を示すブロック図である。
【００６８】
図示するように、変形例１は、図３に示した第１実施形態のメモリシステムにおいて、ハッシュ生成器１６を備える構成を有する。ハッシュ生成器１６は、任意長のデータを固定長のビット列に変換する、いわゆるハッシュ関数の機能を持つ。ここでは、ハッシュ生成器１６は、データ(key)の入力に対して、key-value型データが記憶されたアドレスを生成する。
【００６９】
図８におけるＫＶＳメモリ１４は、図１に示したＫＶＳメモリ１４と同様な構成を有する。また、メインメモリ１２は、図４に示したメインメモリ１２と同様な構成を有する。したがってここでは、図８のＫＶＳメモリ１４及びメインメモリ１２の詳細な構成及び動作の説明は省略する。
【００７０】
変形例１における集合演算の動作は、第１実施形態における動作と同様である。変形例１では、ハッシュ生成器１６を備えることにより、集合演算の実行時におけるＣＰＵ１１の負荷を低減することができる。その他の構成及び効果は前述した第１実施形態と同様である。
【００７１】
［４］変形例２  
図９は、第１実施形態における変形例２のメモリシステムのハードウェア構成を示すブロック図である。
【００７２】
図示するように、変形例２は、図３に示した第１実施形態のメモリシステムにおいて、ハッシュ生成器１６を備え、ＫＶＳメモリとしてＤＲＡＭ１４１を用いている。さらに、メモリコントローラ１３に接続されたメモリ装置としてＮＡＮＤフラッシュメモリ１７を備える。
【００７３】
図９におけるＤＲＡＭ１４１は、図１に示したＫＶＳメモリ１４と同様な構成を有する。また、メインメモリ１２は、図４に示したメインメモリ１２と同様な構成を有する。したがってここでは、図９のＤＲＡＭ１４１及びメインメモリ１２の詳細な構成及び動作の説明は省略する。
【００７４】
変形例２では、第１実施形態におけるＫＶＳメモリ１４としてＤＲＡＭ１４１が用いられており、変形例２における集合演算の動作は、第１実施形態における動作と同様である。さらに、ハッシュ生成器１６を備えることにより、集合演算の実行時におけるＣＰＵ１１の負荷を低減することができる。その他の構成及び効果は前述した第１実施形態と同様である。
【００７５】
［５］変形例３  
図１０は、第１実施形態における変形例３のメモリシステムのハードウェア構成を示すブロック図である。
【００７６】
図示するように、変形例３は、図３に示した第１実施形態のメモリシステムにおいて、ＫＶＳメモリとしてＣＡＭ−ＲＡＭ１４２を用いている。さらに、メモリコントローラ１３に接続されたメモリ装置としてＮＡＮＤフラッシュメモリ１７を備える。
【００７７】
図１０におけるＣＡＭ−ＲＡＭ１４２は、図２に示したＣＡＭ−ＲＡＭ１４２と同様な構成を有する。また、メインメモリ１２は、図４に示したメインメモリ１２と同様な構成を有する。したがってここでは、図１０のＣＡＭ−ＲＡＭ１４２及びメインメモリ１２の詳細な構成及び動作の説明は省略する。
【００７８】
変形例３では、第１実施形態におけるＫＶＳメモリ１４としてＣＡＭ−ＲＡＭ１４２が用いられており、変形例３における集合演算の動作は、第１実施形態における動作と同様である。さらに、ＣＡＭ−ＲＡＭ１４２を備えることにより、集合演算の実行時におけるＣＰＵ１１の負荷を低減することができる。その他の構成及び効果は前述した第１実施形態と同様である。
【００７９】
［第２実施形態］  
［１］ハードウェア構成
第２実施形態のメモリシステムのハードウェア構成について説明する。  
図１１は、第２実施形態のメモリシステムのハードウェア構成を示すブロック図である。  
図示するように、メモリシステムは、ＣＰＵ１１、メインメモリ１２、メモリコントローラ１３、第１のＫＶＳメモリ２４、及び第２のＫＶＳメモリ３４を備える。さらに、ＣＰＵ１１、メインメモリ１２、及びメモリコントローラ１３の間は、バス１５にて接続されている。
【００８０】
ＣＰＵ１１は、メインメモリ１２、メモリコントローラ１３、及び第１、第２のＫＶＳメモリ２４、３４を制御し、後述する集合演算を行う。メモリコントローラ１３は、ＫＶＳメモリ２４、３４及びその他のメモリ（図示しない）を制御する。メモリコントローラ１３は、ダイレクトメモリアクセス（ＤＭＡ：Direct Memory Access）機能を持つ回路を有する。ＤＭＡ機能を用いれば、メモリコントローラ１３とメインメモリ１２との間のデータ転送を、ＣＰＵ１１を介さずに、直接制御することができる。
【００８１】
第１、第２のＫＶＳメモリ２４、３４は、図１または図２に示したようなデータ領域を格納している。ＫＶＳメモリ２４、３４の構成及び動作は、図１または図２を用いて説明した通りであり、その説明は省略する。
【００８２】
［２］集合演算
次に、第２実施形態のメモリシステムにおける集合演算について説明する。
【００８３】
第２実施形態における集合演算の動作は、前述した第１実施形態の集合演算の動作において、ＣＰＵ１１をメモリコントローラ１３に置き換え、ＫＶＳメモリ１４を第１のＫＶＳメモリ２４に、メインメモリ１２を第２のＫＶＳメモリ３４にそれぞれ置き換えたものである。
【００８４】
いま、第１のＫＶＳメモリ２４中に、animal = {dog, tuna, cat}と、fish = {porgy, tuna, salmon}という２つのデータ集合がストアされていたとする。以下に、図３〜図５を参照してＡＮＤ演算、ＯＲ演算、及びＮＯＴ演算の動作を述べる。
【００８５】
（１）ＡＮＤ演算  
具体的な例として、animal AND fishという演算を行う場合の処理を示す。まず、メモリコントローラ１３は第１のＫＶＳメモリ２４に対して、GET(animal, NULL)という命令を発行する（ステップＳ１）。続いて、GET(animal, NULL)の命令に対して、第１のＫＶＳメモリ２４から出力されたデータ集合を、メモリコントローラ１３はanswer集合として第２のＫＶＳメモリ３４に記憶させる。すなわち、answer = {dog, tuna, cat}という集合が第２のＫＶＳメモリ３４に記憶される（ステップＳ２）。
【００８６】
次に、メモリコントローラ１３は、第２のＫＶＳメモリ３４中のanswer集合の中の各要素が第１のＫＶＳメモリ２４内のfish集合の中に存在するかどうか調べる。最初は、メモリコントローラ１３が第１のＫＶＳメモリ２４に対して、GET(fish, dog)という命令を発行する（ステップＳ３）。この返り値はFALSEであるため、メモリコントローラ１３は第２のＫＶＳメモリ３４中のanswer集合の中の要素dogを削除する（ステップＳ４）。
【００８７】
続いて、メモリコントローラ１３は、第２のＫＶＳメモリ３４中のanswer集合の中の全ての要素の処理が終了したかを判定する（ステップＳ５）。ここでは、answer集合の中の全ての要素の処理が終了していないため、ステップＳ３に戻り、ステップＳ３以降の処理を繰り返す。
【００８８】
メモリコントローラ１３は、第１のＫＶＳメモリ２４中のfish集合の中からtunaを探す。すなわち、メモリコントローラ１３は第１のＫＶＳメモリ２４に対して、GET(fish, tuna)という命令を発行する（ステップＳ３）。すると、この返り値はTRUEであるため、次に進む。
【００８９】
catについても同様に、メモリコントローラ１３は第１のＫＶＳメモリ２４中のfish集合の中からcatを探す。すなわち、メモリコントローラ１３は第１のＫＶＳメモリ２４に対して、GET(fish, cat)という命令を発行する（ステップＳ３）。すると、この返り値はFALSEであるため、メモリコントローラ１３は第２のＫＶＳメモリ３４中のanswer集合の中の要素catを削除する（ステップＳ４）。
【００９０】
ステップＳ５において、answer集合の中の全ての要素の処理が終了すると、結果として、第２のＫＶＳメモリ３４中のanswer集合はanswer = {tuna}となり、ＡＮＤ演算の解となる（ステップＳ６）。
【００９１】
（２）ＯＲ演算  
具体的な例として、animal OR fishという演算を行う場合の処理を示す。まず、メモリコントローラ１３は第１のＫＶＳメモリ２４に対して、GET(animal, NULL)という命令を発行する（ステップＳ１１）。続いて、GET(animal, NULL)の命令に対して、第１のＫＶＳメモリ２４から出力されたデータ集合を、メモリコントローラ１３はanswer集合として第２のＫＶＳメモリ３４に記憶させる。すなわち、answer = {dog, tuna, cat}という集合が第２のＫＶＳメモリ３４に記憶される（ステップＳ１２）。
【００９２】
次に、メモリコントローラ１３は、第１のＫＶＳメモリ２４中のfish集合の中の各要素が第２のＫＶＳメモリ３４中のanswer集合の中に存在するかどうかを調べる。最初は、メモリコントローラ１３が第２のＫＶＳメモリ３４に対して、GET(answer, porgy)という命令を発行する（ステップＳ１３）。この返り値はFALSEであるため、メモリコントローラ１３はporgyを第２のＫＶＳメモリ３４中のanswer集合に入れる（ステップＳ１４）。
【００９３】
続いて、メモリコントローラ１３は、第１のＫＶＳメモリ２４中のfish集合の中の全ての要素の処理が終了したかを判定する（ステップＳ１５）。ここでは、fish集合の中の全ての要素の処理が終了していないため、ステップＳ１３に戻り、ステップＳ１３以降の処理を繰り返す。
【００９４】
メモリコントローラ１３は、第１のＫＶＳメモリ２４中のfish集合の中のtunaが第２のＫＶＳメモリ３４中のanswer集合の中に存在するかどうかを調べる。すなわち、メモリコントローラ１３は第２のＫＶＳメモリ３４に対して、GET(answer, tuna)という命令を発行する（ステップＳ１３）。すると、返り値はTRUEであるため、次に進む。
【００９５】
salmonについても同様に、メモリコントローラ１３はfish集合の中のsalmonが第２のＫＶＳメモリ３４中のanswer集合の中に存在するかどうかを調べる。すなわち、メモリコントローラ１３は第２のＫＶＳメモリ３４に対して、GET(answer, salmon)という命令を発行する（ステップＳ１５）。すると、この返り値はFALSEであるため、メモリコントローラ１３はsalmonを第２のＫＶＳメモリ３４中のanswer集合に入れる（ステップＳ１４）。
【００９６】
ステップＳ１５において、fish集合の中の全ての要素の処理が終了すると、結果として、第２のＫＶＳメモリ３４中のanswer集合はanswer = {dog, tuna, cat, porgy, salmon}となり、ＯＲ演算の解となる（ステップＳ１６）。
【００９７】
（３）ＮＯＴ演算  
具体的な例として、animal NOT fishという演算を行う場合の処理を示す。まず、メモリコントローラ１３は第１のＫＶＳメモリ２４に対して、GET(animal, NULL)という命令を発行する（ステップＳ２１）。続いて、GET(animal, NULL)の命令に対して、第１のＫＶＳメモリ２４から出力されたデータ集合を、メモリコントローラ１３はanswer集合として第２のＫＶＳメモリ３４に記憶させる。すなわち、answer = {dog, tuna, cat}という集合が第２のＫＶＳメモリ３４に記憶される（ステップＳ２２）。
【００９８】
次に、メモリコントローラ１３は、第１のＫＶＳメモリ２４中のfish集合の中の各要素を、第２のＫＶＳメモリ３４中のanswer集合から削除する。最初は、メモリコントローラ１３が第２のＫＶＳメモリ３４に対して、DELETE(answer, porgy)という命令を発行する（ステップＳ２３）。
【００９９】
続いて、メモリコントローラ１３は、第１のＫＶＳメモリ２４中のfish集合の中の全ての要素の処理が終了したかを判定する（ステップＳ２４）。ここでは、fish集合の中の全ての要素の処理が終了していないため、ステップＳ２３に戻り、ステップＳ２３以降の処理を繰り返す。
【０１００】
メモリコントローラ１３は、第１のＫＶＳメモリ２４中のfish集合の中のtuna, salmonについても同様に、第２のＫＶＳメモリ３４中のanswer集合から削除する（ステップＳ２３）。
【０１０１】
ステップＳ２４において、fish集合の中の全ての要素の処理が終了すると、結果として、第２のＫＶＳメモリ３４中のanswer集合はanswer = {dog, cat}となり、ＮＯＴ演算の解となる（ステップＳ２５）。
【０１０２】
また、前述のメモリコントローラ１３が行っている作業は、メモリコントローラ１３が有するダイレクトメモリアクセス（ＤＭＡ）機能によりすべて実行することができる。メモリコントローラ１３が行っている作業を、メモリコントローラ１３のＤＭＡ機能によって全て行うことにより、メモリコントローラ１３に負荷をかけることなく、前述の集合演算を行うことが可能である。
【０１０３】
［３］変形例１  
図１２は、第２実施形態における変形例１のメモリシステムのハードウェア構成を示すブロック図である。
【０１０４】
図示するように、変形例１は、図１１に示した第２実施形態のメモリシステムにおいて、ハッシュ生成器１６を備え、ＫＶＳメモリとしてＤＲＡＭ２４１とＣＡＭ−ＲＡＭ型のＮＡＮＤフラッシュメモリ３４１を用いている。
【０１０５】
図１２におけるＤＲＡＭ２４１は、図１に示したＫＶＳメモリ１４と同様な構成を有する。また、ＣＡＭ−ＲＡＭ型のＮＡＮＤフラッシュメモリ３４１は、図２に示したＣＡＭ−ＲＡＭ１４２と同様な構成を有する。したがってここでは、図１２のＤＲＡＭ２４１及びＣＡＭ−ＲＡＭ型のＮＡＮＤフラッシュメモリ３４１の詳細な構成及び動作の説明は省略する。
【０１０６】
変形例１における集合演算の動作は、第２実施形態における動作と同様である。さらに、ハッシュ生成器１６及びＣＡＭ−ＲＡＭ型のＮＡＮＤフラッシュメモリ３４１を備えることにより、集合演算の実行時におけるＣＰＵ１１の負荷を低減することができる。その他の構成及び効果は前述した第２実施形態と同様である。
【０１０７】
［４］変形例２  
図１３は、第２実施形態における変形例２のメモリシステムのハードウェア構成を示すブロック図である。
【０１０８】
図示するように、変形例２は、図１１に示した第２実施形態のメモリシステムにおいて、ＫＶＳメモリとしてＣＡＭ−ＲＡＭ２４２とＣＡＭ−ＲＡＭ型のＮＡＮＤフラッシュメモリ３４１を用いている。
【０１０９】
図１３におけるＣＡＭ−ＲＡＭ２４２とＣＡＭ−ＲＡＭ型のメモリ３４１は、図２に示したＣＡＭ−ＲＡＭ１４２と同様な構成を有する。したがってここでは、図１２のＣＡＭ−ＲＡＭ２４２とＣＡＭ−ＲＡＭ型のメモリ３４１の詳細な構成及び動作の説明は省略する。
【０１１０】
変形例２における集合演算の動作は、第２実施形態における動作と同様である。さらに、ＣＡＭ−ＲＡＭ２４２及びＣＡＭ−ＲＡＭ型のＮＡＮＤフラッシュメモリ３４１を備えることにより、集合演算の実行時におけるＣＰＵ１１の負荷を低減することができる。その他の構成及び効果は前述した第２実施形態と同様である。
【０１１１】
実施形態によれば、全文検索システム等で多発する集合演算に係るシステム負荷を著しく低減し、さらに高速に集合演算を行うことが可能なメモリシステムを提供できる。
【０１１２】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１１３】
１１…ＣＰＵ、１２…メインメモリ、１２Ａ…ハッシュテーブル領域、１２Ｂ…実データ領域、１３…メモリコントローラ、１４…ＫＶＳメモリ、１４Ａ…ハッシュテーブル領域、１４Ｂ…実データ領域、１５…バス、１６…ハッシュ生成器、１７…ＮＡＮＤフラッシュメモリ、２４…第１のＫＶＳメモリ、３４…第２のＫＶＳメモリ、１００…上位システム、１４１…ＤＲＡＭ、１４２…ＣＡＭ−ＲＡＭ、１４２Ａ…ＣＡＭ部、１４２Ｂ…ＲＡＭ部、２４１…ＤＲＡＭ、２４２…ＣＡＭ−ＲＡＭ、３４１…ＣＡＭ−ＲＡＭ型のＮＡＮＤフラッシュメモリ。
【図１】
0005992577.tif 000002
【図２】
0005992577.tif 000003
【図３】
0005992577.tif 000004
【図４】
0005992577.tif 000005
【図５】
0005992577.tif 000006
【図６】
0005992577.tif 000007
【図７】
0005992577.tif 000008
【図８】
0005992577.tif 000009
【図９】
0005992577.tif 000010
【図１０】
0005992577.tif 000011
【図１１】
0005992577.tif 000012
【図１２】
0005992577.tif 000013
【図１３】
0005992577.tif 000014