まず、ハフマン符号化による圧縮伸張処理と、その変形例について説明する。
図1は、ハフマン木の例を示す。図1に示されるハフマン木は、文字情報(0、>、<br>、1、<、a、s、t、x)と圧縮符号との対応関係を示す。
文字情報(0、>、<br>、1、<、a、s、t、x)は、あくまでハフマン木の説明のために用いられる例示の文字情報である。圧縮対象の文字情報として、例えば、数字、アルファベット、ひらがな、カタカナ、漢字、アラビア文字、キリル文字、記号(全角または半角)などの文字コードや、複数の文字を組み合わせた文字列(予約語)、さらには、固定長のビット列などが用いられる。図1に示すリストT1は、圧縮対象の文字情報がリスト化され、圧縮対象データ内での出現頻度順にソートされたものである。さらに、圧縮対象の文字情報のうち、文字コードとビット長が同一でない文字情報(図1の例においては、予約語「<br>」など)は、リストT1以外のリストをさらに用いて管理される。リストT1の各文字情報は、ハフマン木の葉のデータ構造体HL(HL1〜HL9)にそれぞれ格納される。
リストT1の各文字情報と圧縮符号との対応関係は、ハフマン木の根のデータ構造体HRから葉のデータ構造体HL(HL1〜HL9)への探索経路により示される。根HR、節のデータ構造体HN(HN11、HN12、HN21−HN23、HN31、HN32)のそれぞれでは、ビットが「0」か「1」かに応じた分岐が存在し、探索経路における分岐で用いられたビットにより圧縮符号が示される。また、ハフマン符号化においては、出現頻度の高い文字情報ほど符号長が短い圧縮符号が割り当てられ、出現頻度の低い文字情報ほど符号長が長い圧縮符号が割り当てられる。例えば、文字情報「t」の圧縮符号は、文字情報「t」を格納する葉のデータ構造体HL8への探索経路により示される。根HRからデータ構造体HL8への探索は、ビット「1」で示される根HRから節HN12への経路と、ビット「1」で示される節HN12から節HN23への経路と、ビット「1」で示される節HN23から節HN32への経路と、ビット「0」で示される節HN32から葉HL8への経路と、を順に辿ることで行なわれる。図1においては、根HRから葉のデータ構造体HL8までの探索経路に含まれる経路を示すビットを順に並べた「1110」が文字情報「t」に割り当てられた圧縮符号となる。
図2は、データ構造体同士の参照関係を示す。図1を用いて説明した探索は、図2に示すポインタの参照関係を用いて行なわれる。根のデータ構造体HRおよび節のデータ構造体HNの凡例をHX1〜HX3に示す。凡例HX1には、上位のデータ構造体へのポインタ、ポインタを格納していることの1つめの識別子(図中では「0」)、下位のデータ構造体(1つめ)へのポインタ、さらにポインタを格納していることの2つめの識別子(図中では「0」)及び下位のデータ構造体(2つめ)へのポインタが含まれる。凡例HX2には、上位のデータ構造体へのポインタ、文字コードを格納していることの識別子(図中では「1」)、文字コード、さらにポインタを格納していることの識別子(図中では「0」)及び下位のデータ構造体へのポインタが含まれる。また、凡例HX3には、上位のデータ構造体へのポインタ、文字コード(1つめ)を格納していることの識別子(図中では「1」)、文字コード(1つめ)、さらに文字コード(2つめ)を格納していることの識別子(図中では「1」)及び文字コード(2つめ)が含まれる。根のデータ構造体HRおよび節のデータ構造体HNのそれぞれは、凡例HX1〜HX3のいずれかのデータ構造となる。また、葉のデータ構造体部分には、文字コードでなく、文字列(予約語)の文字コードを格納した格納位置を示すポインタが格納される場合がある。このポインタは、後述のリストT8における対応の文字列の格納位置を示す。データ構造体から読み出される識別子に基づいて、データ構造体から読み出される情報が、ポインタであるのか、文字コードであるのかが判断される。例えば、識別子(1つめ)へのポインタを読み出す際のオフセットや、識別子(2つめ)へのポインタをよみだす際のオフセットは予め定められている。例えば、データ構造体内部に格納されるポインタ及び識別子、または文字コードおよび識別子の格納領域がそれぞれ32bitであり、読み出したビットがxであるとすると、32×(1+x)で識別子読出しのオフセットが算出される。
伸張処理においては、圧縮符号に基づいて、圧縮符号に対応する文字情報が読み出される。例えば、圧縮データから読み出したビットが「0」の場合に下位のデータ構造体(1つめ)の参照が行なわれ、ビットが「1」の場合に下位のデータ構造体(2つめ)の参照が行なわれる。すると、圧縮データから読み出したビットに応じたポインタを用いて、次に参照するデータ構造体が特定される。例えば、圧縮データから「1110・・・」の順でデータが読み出されるとする。すると、根のデータ構造体HRにおいて下位のデータ構造体(2つめ)へのポインタは、節のデータ構造体HN12へのポインタであり、ポインタに基づいて節のデータ構造体HN12が参照される。さらに、節のデータ構造体HN12において、下位のデータ構造体(2つめ)へのポインタは、節のデータ構造体HN23へのポインタであり、ポインタに基づいて節のデータ構造体HN23が参照される。節のデータ構造体HN23において、下位のデータ構造体(2つめ)へのポインタは、節のデータ構造体HN32へのポインタであり、ポインタに基づいて節のデータ構造体HN32が参照される。節のデータ構造体HN32には、文字コードが格納されており、4番目の圧縮符号が「1」であるため、圧縮符号「1110」に対応する文字情報「t」を格納する葉のデータ構造体HL8が参照される。葉のデータ構造体においては、データ構造体に含まれる情報が文字コードであることを示す識別子(図中では「1」)が付されるため、識別子に基づいて、ポインタでなく文字コードを取得したことが判断される。
逆に、圧縮処理においては、文字情報に基づいて圧縮符号が読み出される。文字情報を格納する葉のデータ構造体から、上位のデータ構造体へのポインタに基づいてデータ構造体を参照することによって圧縮符号が得られる。ただし、圧縮処理においては、例えば、ハフマン木を辿らずに、文字情報と圧縮符号とを対応付けたテーブルを生成し、生成したテーブルに基づいて圧縮符号を取得する方法を用いてもよい。
図3は、圧縮伸張辞書のデータ構造T3の例を示す。図3に例示する圧縮伸張辞書には、ヘッダ領域のデータ構造体HH、根のデータ構造体HR及び節のデータ構造体HNが含まれる。ヘッダ領域のデータ構造体HHは、根のデータ構造体HR及び節のデータ構造体HNに関する情報を含む。データ構造体HHは、根のデータ構造体HRのメモリ空間上での先頭アドレスと、根のデータ構造体HR及び節のデータ構造体HNのデータサイズと、を含む。
図3の例においては、図2に示す根のデータ構造体HR及び葉のデータ構造体HN(HN11,HN12,HN21−23,HN31およびHN32)が連続して格納される。図3に例示するように各データ構造体が連続する場合には、根のデータ構造体HR及び節のデータ構造体HNに含まれるポインタは、ヘッダ領域HHに格納される先頭アドレスからのオフセットでもよい。例えば、根のデータ構造体HRおよび節のデータ構造体HNのそれぞれのデータサイズが32×3bitであるとすると、節のデータ構造体HN21へのポインタは32×3×3などで示される。すると、根の構造体HRの先頭アドレスからオフセットが32×3×3の位置に、節のデータ構造体HN21が存在すると判断できる。
図4は、ハフマン木の変形例を示す。図4においても、図1と同様に、0、>、<br>、1、<、a、s、t、xを圧縮対象の文字情報の例としている。また、図4に示す変形させたハフマン木においても、各文字情報には図1に示すハフマン木と同じ圧縮符号が割り当てられている。図4においては、葉のデータ構造体KL(KL1〜KL9)のそれぞれには、文字情報と、文字情報に割り当てられる圧縮符号の符号長とが格納される。葉のデータ構造体KLの内容は、図4のテーブルT4に示す通りである。
図4に示す変形例においては、根のデータ構造体KRにおける分岐判定は、4ビットのビット列に基づいて行なわれる。図4の例においては、4ビットのビット列で分岐判定されるが、当然ながら、圧縮対象の文字情報種類の数などに応じて他のビット数で行なうように変形可能である。例えば、ビット列「0100」を圧縮データから読み出した場合には、葉のデータ構造体KL2が読み出される。また、ビット列「0101」が圧縮データから読み出された場合にも葉のデータ構造体KL2が読み出される。すなわち、根のデータ構造体KRにおける分岐判定では、互いに異なるビット列「0100」及び「0101」のいずれが読み出された場合にも、同じ葉のデータ構造体KL2を示すポインタが読み出され、そのポインタに基づいて葉のデータ構造体の読み出しが行なわれる。
また、圧縮データから4ビット読み出したにも関わらず、葉のデータ構造体KL2に格納された文字情報「>」に対応するする圧縮符号は、「010」である。そのため、圧縮データからのビット読み出し位置は、実際に読み出した4ビットではなく、葉のデータ構造体KL2に格納された符号長に応じて3ビット進められる。これにより、実際に割り当てられた圧縮符号よりも余分に圧縮データから読み出した分のビットが調整される。根のデータ構造体KRにおいても、図2に示すハフマン木と同様に、読み出したビット列に応じて、ポインタを読み出すオフセットが定められている。
図5は、図4に示すハフマン木の変形例における圧縮伸張辞書データT5のデータ構造の例を示す。圧縮伸張辞書データT5は、ヘッダ領域HH(ヘッダのデータ構造体KH1及びヘッダのデータ構造体KH2を含む)、根のデータ構造体KR、葉のデータ構造体KL(KL1〜KL9)を含む。ヘッダのデータ構造体KH1は、メモリ空間上での根のデータ構造体KRの先頭アドレスと、根のデータ構造体KRのデータサイズとを含む。ヘッダのデータ構造体KH2は、メモリ空間上での葉のデータ構造体KLの先頭アドレスと、葉のデータ構造体KLのデータサイズとを含む。
圧縮伸張辞書データT5の根のデータ構造体KRにおいては、4ビットのビット列「0000」〜「1111」のそれぞれに基づいて定められるオフセットの位置に、葉のデータ構造体へのポインタが格納される。葉のデータ構造体へのポインタのサイズが32ビットであるとすると、例えば、データ構造T5の始点から、オフセットは4ビットのビット列×32の位置で示される。圧縮符号長が4ビットよりも短い文字情報を格納する葉のデータ構造体へのポインタは、複数の位置に格納される。例えば、文字情報「>」には圧縮符号「010」が割り当てられており、圧縮符号長は4ビットに対して1ビット短い。この場合は、文字情報「>」を格納する葉のデータ構造体KL2へのポインタは、圧縮符号「010」に冗長に1ビットを付加して得られる4ビットのビット列「0100」及び「0101」に示される位置に格納される。このように、冗長に葉のデータ構造体へのポインタを格納しておくことで、まとめて読み出したビット列に基づく文字情報の読み出しが行なわれる。
圧縮伸張辞書データT5の葉のデータ構造体KLは、圧縮対象のそれぞれの文字コードと、文字コードに割り当てられた圧縮符号の符号長とを含む。また、根のデータ構造体KRのそれぞれは、ポインタを格納していることを示す識別子を含み、葉のデータ構造体KLのそれぞれは、文字コードを格納していることを示す識別子を含む。
図4及び5の変形例においては、文字情報と、文字情報に割り当てられた圧縮符号との組に対して、同一のポインタを複数格納することにより、まとめて読み出したビット列に基づいてポインタを特定することを可能としている。
図4及び5に示されるハフマン木の変形例においては、節のデータ構造体へのポインタが含まれない。そのため、節のデータ構造体へのポインタと、葉のデータ構造体へのポインタとの双方が含まれるデータ構造体が存在しない。そのため、例えば、葉のデータ構造体へのポインタの代わりに、文字情報及び圧縮符号長などの葉のデータ構造体に含まれる情報を格納しても、文字情報とポインタがデータ構造体内部に混在する事態が生じない。すなわち、各データ構造体の中身を確認しなくても、圧縮伸張辞書データから圧縮対象の文字情報群を取得することができる。また、文字情報と併せて圧縮符号長も格納されるので、圧縮符号長に基づけば、圧縮伸張辞書内において何個連続で同じ文字情報が格納されているかも算出可能である。そのため、圧縮伸張辞書内から文字情報を読み出す場合に、重複する文字情報については読み飛ばすことができる。
そこで、本実施形態においては、例えば、図6に例示する圧縮伸張辞書データを用いる。図6に例示される圧縮伸張辞書データT6は、ヘッダ領域Hと葉のデータ構造体Lとを含む。ヘッダ領域Hには、メモリ空間上での葉のデータ構造体Lの先頭アドレスと、葉のデータ構造体Lのデータサイズとが含まれる。葉のデータ構造体Lにおいては、4ビットのビット列「0000」〜「1111」のそれぞれに基づいて定められるオフセットの位置に、それぞれのビット列に対応する文字情報および圧縮符号長が格納される。葉のデータ構造体Lのサイズが32ビットであるとすると、各葉のデータ構造体の読み出し位置は、例えば、葉のデータ構造体Lの先頭アドレスからのオフセットは、4ビットのビット列×32の位置で示される。圧縮符号長が4ビットよりも短い圧縮符号を割り当てられた文字情報を格納する葉のデータ構造体Lは、複数の位置に格納される。例えば、文字情報「>」には圧縮符号「010」が割り当てられており、圧縮符号長は4ビットに対して1ビット短い。この場合は、文字情報「>」を格納する葉のデータ構造体は、圧縮伸張辞書データT6において、圧縮符号「010」に冗長に1ビットを付加して得られる4ビットのビット列「0100」及び「0101」に示される位置に格納される。このように、冗長に葉のデータ構造体Lを格納しておくことで、まとめて読み出したビット列に基づく文字情報の読み出しが行なわれる。
例えば、圧縮伸張辞書データT6を用いた伸張処理では、圧縮符号を含むビット列が読み出されると、ヘッダ領域H内の葉のデータ構造体Lの先頭アドレスの読み出しが行なわれ、読み出した先頭アドレスからのオフセットの算出が、読み出したビット列に基づいて行なわれる。さらに、算出されたオフセットに基づいて文字情報及び符号長の読み出しが行なわれることで伸張が行なわれる。一方の圧縮伸張辞書データT5を用いた伸張処理では、圧縮符号を含むビット列が読み出されると、ヘッダのデータ構造体KH1内の根のデータ構造体KRの先頭アドレスの読み出しが行なわれ、読み出した先頭アドレスからのオフセットの算出が、読み出したビット列に基づいて行なわれる。算出したオフセットに基づいてポインタを読み出すと、さらに、ヘッダのデータ構造体KH2から葉のデータ構造体KLの先頭アドレスの読み出しが行なわれる。読みだした先頭アドレスからオフセットの算出を、読み出したポインタに基づいて行ない、その結果、算出されたオフセットに基づいて文字情報の読み出し及び符号長が行なわれる。上述のように、圧縮伸張データT5を用いた伸張処理では、圧縮伸張データT6を用いた伸張処理よりもヘッダ領域にアクセスする回数が多くなってしまう。圧縮伸張辞書データT6を用いた伸張処理では、圧縮伸張辞書データT5を用いた伸張処理おいて行なわれるヘッダ領域KH1へのアクセスおよび根のデータ構造体KRへのアクセス分のアクセス処理が行なわれない。そのため、圧縮伸張辞書データT6を用いた伸張処理は、圧縮伸張辞書データT5を用いた伸張処理よりも伸張速度が速くなることが見込まれる。
さらに、例えば、圧縮伸張辞書データT5における各節のデータ構造体及び各葉のデータ構造体も、圧縮伸張辞書データT6における各葉のデータ構造体も、データサイズが共通であるとする。すると、圧縮伸張辞書データT5においてポインタが格納される節のデータ構造体KNに、葉のデータ構造体Lが収まることとなる。そのため、圧縮伸張辞書データT6は、圧縮伸張辞書データT5よりも、圧縮対象の文字情報の種類の数×各データ構造体のデータサイズの分だけデータサイズが小さくなる。
本実施形態の他の側面によれば、ポインタの参照処理が抑制されるので伸張処理速度を向上させることができる。
続いて、本実施形態の詳細について説明する。
図7は、コンピュータ1の機能ブロックの構成例を示す。コンピュータ1は、制御部10及び記憶部11を含む。制御部10は、コンピュータ1全体の制御を行なうとともに、記憶部11に記憶されたデータに対し、圧縮処理、伸張処理及び検索処理を実行する。記憶部11は、制御部10により行なわれる圧縮処理、伸張処理及び検索処理の処理対象となるデータおよび処理に使用されるデータを記憶する。また、記憶部11は、制御部10が処理を実行する際にワークエリアとして用いられる。また、例えば、記憶部11がコンピュータ1の外部に存在し、コンピュータ1との通信により制御部10が記憶部11に記憶されたデータにアクセスすることとしてもよい。
制御部10は、圧縮部101、伸張部102および検索部103を含む。圧縮部101は記憶部11に記憶された圧縮対象のデータの圧縮処理を行ない、伸張部102は記憶部11に記憶された伸張対象のデータの伸張処理を行ない、検索部103は検索要求に応じて記憶部11に記憶された検索対象のデータに対して検索処理を行なう。
圧縮部101は、生成部1011及び変換部1012を含む。生成部1011は、圧縮対象のデータと、圧縮対象の文字情報のリストとに基づいて、図6に例示する圧縮伸張辞書データを生成する。変換部1012は、生成部1011が生成した圧縮伸張辞書データに基づいて、圧縮対象のデータを圧縮符号に変換する。生成部1011及び変換部1012の処理の詳細については後述する。
伸張部102は、変換部1021及び調整部1022を含む。変換部1021は、伸張対象のデータに対応する圧縮伸張辞書データに基づいて、伸張対象のデータを文字情報に変換する。調整部1022は、変換部1021が伸張対象のデータを読み出す際の読み出し位置を、圧縮伸張辞書データに基づいて調整する。変換部1021及び調整部1022の処理の詳細については後述する。
検索部103は、探索部1031、調整部1032及び照合部1033を含む。探索部1031は、検索要求に含まれる検索条件に基づいて照合対象を抽出する抽出条件を設定し、圧縮データ内に抽出条件を満たすデータが含まれているか探索し、抽出条件を満たす圧縮データを伸張する。調整部1032は、探索部1031による圧縮データの読み出し位置を圧縮伸張辞書データに基づいて調整する。照合部1033は、探索部1031の伸張により得られた文字情報と検索条件との照合を行なう。探索部1031、調整部1032及び照合部1033の処理の詳細については後述する。
図8は、コンピュータ1のハードウェア構成例を示す。コンピュータ1は、例えば、プロセッサ301、RAM(Random Access Memory)302、ROM(Read Only Memory)303、ドライブ装置304、記憶媒体305、入力インターフェース(I/F)306、入力デバイス307、出力インターフェース(I/F)308、出力デバイス309、通信インターフェース(I/F)310、SAN(Storage Area Network)インターフェース(I/F)311およびバス312などを含む。それぞれのハードウェアはバス312を介して接続されている。
RAM302は読み書き可能なメモリ装置であって、例えば、SRAM(Static RAM)やDRAM(Dynamic RAM)などの半導体メモリ、またはRAMでなくてもフラッシュメモリなどが用いられる。ROM303は、PROM(Programmable ROM)なども含む。ドライブ装置304は、記憶媒体305に記録された情報の読み出しか書き込みかの少なくともいずれか一方を行なう装置である。記憶媒体305は、ドライブ装置304によって書き込まれた情報を記憶する。記憶媒体305は、例えば、ハードディスク、SSD(Solid State Drive)などのフラッシュメモリ、CD(Compact Disc)、DVD(Digital Versatile Disc)、ブルーレイディスクなどの記憶媒体である。また、例えば、コンピュータ1は、複数種類の記憶媒体それぞれについて、ドライブ装置304及び記憶媒体305を設ける。
入力インターフェース306は、入力デバイス307と接続されており、入力デバイス307から受信した入力信号をプロセッサ301に伝達する。出力インターフェース308は、出力デバイス309と接続されており、出力デバイス309に、プロセッサ301の指示に応じた出力を実行させる。通信インターフェース310はネットワーク3を介した通信の制御を行なう。SANインターフェース311は、コンピュータ1に接続されたストレージエリアネットワークを介して記憶装置と通信の制御を行なう。
入力デバイス307は、操作に応じて入力信号を送信する装置である。入力信号は、例えば、キーボードやコンピュータ1の本体に取り付けられたボタンなどのキー装置や、マウスやタッチパネルなどのポインティングデバイスである。出力デバイス309は、コンピュータ1の制御に応じて情報を出力する装置である。出力デバイス309は、例えば、ディスプレイなどの画像出力装置(表示デバイス)や、スピーカーなどの音声出力装置などである。また、例えば、タッチスクリーンなどの入出力装置が、入力デバイス307及び出力デバイス309として用いられる。また、入力デバイス307及び出力デバイス309は、コンピュータ1に含まれず、例えば、コンピュータ1に外部から接続する装置であってもよい。
プロセッサ301は、ROM303や記憶媒体305に記憶されたプログラムをRAM302に読み出し、読み出されたプログラムの手順に従って制御部10の処理を行なう。その際にRAM302はプロセッサ301のワークエリアとして用いられる。記憶部11の機能は、ROM303および記憶媒体305がプログラムファイル(後述のアプリケーションプログラム24、ミドルウェア23およびOS22など)やデータファイル(圧縮対象のデータファイルや圧縮ファイル)を記憶し、RAM302がプロセッサ301のワークエリアとして用いられることによって実現される。プロセッサ301が読み出すプログラムについては、図9を用いて説明する。
図9は、コンピュータ1で動作するプログラムの構成例を示す。コンピュータ1において、図8に示すハードウェア群21の制御を行なうOS(オペレーションシステム)22が動作する。OS22に従った手順でプロセッサ301が動作して、ハードウェア21の制御・管理が行なわれることにより、アプリケーションプログラム24やミドルウェア23に従った処理がハードウェア群21で実行される。さらに、コンピュータ1において、ミドルウェア23またはアプリケーションプログラム24が、RAM302に読み出されてプロセッサ301により実行される。
プロセッサ301が、ミドルウェア23またはアプリケーションプログラム24に含まれる圧縮機能に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア21を制御して)圧縮部101の機能が実現される。また、プロセッサ301が、ミドルウェア23またはアプリケーションプログラム24に含まれる伸張機能に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア21を制御して)伸張部102の機能が実現される。また、プロセッサ301が、ミドルウェア23またはアプリケーションプログラム24に含まれる検索機能に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア21を制御して)検索部103の機能が実現される。圧縮機能、伸張機能及び検索機能は、それぞれアプリケーションプログラム24自体に定義されてもよいし、アプリケーションプログラム24に従って呼び出されることで実行されるミドルウェア23の機能であってもよい。
図10は、コンピュータ1を用いたシステムの構成例を示す。図10のシステムは、コンピュータ1a、コンピュータ1b、基地局2およびネットワーク3を含む。コンピュータ1aは、無線または有線の少なくとも一方により、コンピュータ1bと接続されたネットワーク3に接続している。例えば、図10のシステムにおいて、コンピュータ1bが本実施形態の圧縮処理により圧縮したデータファイルをコンピュータ1aが取得し、コンピュータ1aがコンピュータ1bから取得した圧縮ファイルを本実施形態の伸張処理により伸張する。逆に、例えば、図10のシステムにおいて、コンピュータ1aが本実施形態の圧縮処理により圧縮したデータファイルをコンピュータ1bが取得し、コンピュータ1bがコンピュータ1aから取得した圧縮ファイルを本実施形態の伸張処理により伸張する。また、例えば、図10のシステムにおいて、コンピュータ1bが本実施形態の圧縮処理により圧縮したデータファイルをコンピュータ1aが取得し、コンピュータ1aがコンピュータ1bから取得した圧縮ファイルを本実施形態の検索処理により検索する。逆に、例えば、図10のシステムにおいて、コンピュータ1aが本実施形態の圧縮処理により圧縮したデータファイルをコンピュータ1bが取得し、コンピュータ1bがコンピュータ1aから取得した圧縮ファイルを本実施形態の検索処理により検索する。また、圧縮処理、伸張処理及び検索処理の少なくとも2つがコンピュータ1a内で行なわれることとしてもよい。さらに、圧縮処理及び検索処理がコンピュータ1aもしくは1bのいずれか一方で行なわれ、他方のコンピュータから検索要求が送信されることとしてもよい。
次に、コンピュータ1で行なわれる圧縮処理手順を説明する。
図11は、圧縮部101による圧縮処理のフローチャート例を示す。アプリケーションプログラム24の機能もしくはユーザの入力指示に応じて、圧縮処理機能が呼び出される(S100)と、圧縮部101は、圧縮処理機能の呼び出しにおいて指定される圧縮対象のデータファイルを記憶部11から読み出す(S101)。S101で読みだした圧縮対象のデータファイルに基づいて、生成部1011は、図6に示す圧縮伸張辞書データT6を生成する(S102)。生成部1011による圧縮伸張辞書データT6の生成については、図12を用いて後述する。続いて、変換部1012は、生成部1011により生成された圧縮伸張辞書データT6に基づいて、圧縮対象のデータファイルを圧縮符号に変換する(S103)。変換部1012による圧縮符号への変換については、図16を用いて後述する。変換部1012による圧縮符号への変換処理が圧縮対象データに対して行なわれると、圧縮部101は、変換により得られたデータをファイル化して圧縮ファイルを生成する(S104)。圧縮部101により圧縮ファイルが得られると、S100で呼び出された圧縮処理は終了となる(S105)。
図12は、圧縮伸張辞書データT6の生成処理のフローチャート例を示す。図11におけるS102の処理が行なわれる(S200)と、生成部1011は、S101で読み出された圧縮対象のデータファイルに含まれる文字情報の出現頻度の集計を行なう(S201)。S201の処理において、圧縮伸張辞書データを格納する記憶領域を確保し、ヘッダのデータ構造体Hを生成する。生成部1011は、圧縮対象のデータファイルから文字情報を順次読み出し、読出し結果を図13に示す頻度集計テーブルT7に反映させる。
図13は、頻度集計テーブルT7の例を示す。図13に示す例においては、頻度集計テーブルT7に含まれる各レコードにおいて文字情報と、文字情報の出現回数を示す計数値とが対応付けて格納される。頻度集計テーブルT7に格納される文字情報は、例えば、圧縮対象のデータファイルに用いられる文字コード系における数字、アルファベット、ひらがな、カタカナ、漢字、アラビア文字、キリル文字などの少なくとも一部の文字である。漢字については、例えば常用漢字の文字コードのみが頻度集計テーブルT7に格納されてもよい。また、文字情報は、例えば、文字コード以外の固定長データも含む。例えば、LZ77に基づいて得られる圧縮符号列は、スライド窓内のアドレスと一致したデータの長さ情報とが圧縮符号列として出力されるため固定長となる。ZIPなどの圧縮アルゴリズムでは、LZ77により得られた固定長の圧縮符号列に対し、ハフマン符号化が用いられる。さらに、文字情報は、文字列を含んでもよい。例えば、文字情報は、図14に例示される文字列リストT8に含まれる文字列も含む。本実施形態においては、簡易な説明とする例として、頻度集計テーブルT7に格納される文字情報は、図1のリストT1に示す文字情報とする。
S201の処理において、生成部1011は、圧縮対象のデータファイルから順次データを読み出す。この際、生成部1011は、例えば、圧縮対象のデータファイルに用いられる文字コード系で1字当たりのビット長のデータを読み出す。生成部1011は、例えば、読み出したデータと合致する文字コードを頻度集計テーブルT7から検出し、検出されたレコードに格納される計数値をインクリメントする。また、頻度集計テーブルT7に、文字列リストT8に格納される文字列も含まれる場合には、生成部1011は、圧縮対象のデータファイルからのデータの読み出しにおいて、まず、文字列リストT8に格納される文字列の読み出しであるかを判定する。その判定において文字列リストT8に格納される文字列の読み出しであると判定した場合には、生成部1011は、その文字列を読み出し、頻度集計テーブルT7のうち、読み出した文字列を含むレコード内の計数値をインクリメントする。判定において文字列リストT8に格納される文字列の読みだしで無いと判定した場合には、生成部1011は、1字当たりのビット長のデータを読み出し、読出し結果を頻度集計テーブルT7の計数値に反映させる。
S201の頻度集計処理が終了すると、生成部1011は、頻度集計テーブルT7に反映された集計結果に基づいて、頻度集計テーブルT7を頻度順にソートする(S202)。さらに、生成部1011は、圧縮対象のデータファイル内の文字情報の出現頻度分布に基づいて、圧縮符号長の分布を算出する(S203)。算出された圧縮符号長は、図15に示す符号長分布テーブルT9に格納される。
図15は、符号長分布テーブルT9の例を示す。図15の例においては、符号長1〜4のそれぞれに文字情報の数が対応付けられている。図15の例では、符号長が1の文字情報の数は0、符号長が2の文字情報の数は1、符号長が3の文字情報の数は4、符号長が4の文字情報の数は4である。
符号長の分布は、圧縮対象の文字情報の頻度分布に応じて算出される。例えば、圧縮対象の文字情報それぞれについて、頻度に基づいて符号長が定められることとしてもよい。例えば、圧縮対象のファイルで出現する頻度が、圧縮ファイル全体に対して1/(2のn乗)の頻度であれば、nビットの圧縮符号を割り当てるなどとしてもよい。
S203の処理が行なわれると、生成部1011は、圧縮対象の文字情報のそれぞれに対して圧縮符号の割り当てを行なう(S204〜S210)。圧縮対象の文字情報の種類がk種類であるとした場合に、1番目からk番目までの圧縮対象の文字情報に、例えばソートされた順番で圧縮符号の割り当てが繰り返し行なわれる。また、圧縮符号の割り当てが何回目かをiで示すとする。iの初期値は1である。
まず、iがk未満であるか否かを判定する(S204)。iがkに達した場合(S204:NO)には、圧縮符号の割り当てと、圧縮伸張辞書のデータ構造体の生成とが、圧縮対象の各文字情報について完了するので、圧縮伸張辞書データの生成処理を終了する(S211)。
iがk未満である場合(S204:YES)には、生成部1011は、ソートされた頻度集計テーブルから、圧縮対象の文字情報のうちi番目の文字情報を読み出す(S205)。さらに、生成部1011は、符号長分布テーブルT9から、読みだしたi番目の文字情報に対応する符号長を読み出し、読みだした符号長に応じてコピー数Cを算出する(S206)。コピー数Cは、読みだした文字情報を複製する数を示す。コピー数Cは、例えば、2を底とし、(所定長−読みだした符号長)をべき数とするべき乗で表される。
また、生成部1011は、S205で読みだした文字情報についての葉の構造体を生成する(S207)。S207で生成する葉の構造体は、i番目の文字情報の文字コードおよび符号長を含む。また、例えば、葉の構造体は、照合フラグを含む。S206とS207とで順序が入れ替えられてもよい。
続いて、生成部1011は、S207で生成された葉の構造体を、S206で算出されたコピー数Cだけ複製し、複製して得られた情報を記憶部11の記憶領域に格納する(S208)。次に、生成部1011は、コピー数Cに応じて情報の書き込み位置を更新する(S209)。例えば、各葉の構造体が32ビットであるとすると、書込み位置を32×コピー数C進める。さらに、生成部1011は、iの値をインクリメントして(S210)、S204の処理を再度行なう。
図16は、変換処理のフローチャート例を示す。図11に示すS103の処理が行なわれる(S300)と、まず、変換部1012は、圧縮対象のデータファイル内に文字情報が残されているか否かを判定する(S301)。続いて、変換部1012は、圧縮対象のデータファイルから文字情報を読み出す(S302)。変換部1012は、生成部が生成した圧縮伸張辞書データT6を参照し、読み出した文字情報と一致する文字情報を探索する(S303)。変換部1012は、読みだした文字情報と一致する文字情報を格納する葉の構造体の格納位置に基づいて圧縮符号を算出し、算出された圧縮符号を記憶部11の記憶領域に書き込む(S304)。圧縮符号は、葉の構造体の格納位置(葉のデータ構造体Lの先頭アドレスからのオフセット)を各葉の構造体のデータサイズで除算することにより得られる。S304の処理を行なうと、変換部1012は再度S301の処理を行なう。S301〜S304を繰り返し行ない、圧縮対象のデータファイルに文字情報が含まれなくなったら、変換部1012は、変換処理を終了する(S305)。
図11のS103の処理が終了すると、圧縮部101は、生成部1011によって生成された圧縮伸張辞書データT6と、変換部1012によって記憶部11に書き込まれた圧縮符号列と、を含む圧縮ファイルを生成する(S104)。S104の処理が行なわれると、ファイルの圧縮処理を終了する(S105)。
続いて、コンピュータ1で行なわれる伸張処理手順を説明する。
図17は、伸張部102による伸張処理のフローチャート例を示す。アプリケーションプログラム24の機能もしくはユーザの入力指示に応じて、伸張処理機能が呼び出される(S400)と、伸張部102は、伸張処理機能の呼び出しにおいて指定される圧縮ファイルを記憶部11から読み出す(S401)。伸張部102は、S401で読みだした圧縮ファイルから記憶部11に圧縮伸張データを展開する(S402)。図11の説明において例示された圧縮データであれば、図6に示す圧縮伸張データT6が展開される。続いて、伸張部102は、変換部1021と調整部1022との処理により、圧縮ファイルの伸張を行なう(S403)。
図18は、圧縮符号を伸張文字情報に変換する変換処理のフローチャート例を示す。図17のS403で伸張処理が行なわれる(S500)と、調整部1022は、S401で読みだした圧縮ファイルのうちの圧縮符号列の始点に読み出し位置をセットする(S501)。変換部1021は、セットされた読み出し位置から圧縮符号を読み出し可能か否かを判定する(S502)。セットされた読み出し位置から圧縮符号が読みだせない(圧縮符号を全て読みだした)場合(S502:NO)には、変換処理のフローが終了される(S506)。
S502の処理で圧縮符号を読み出し可能である場合(S502:YES)は、変換部1021は、セットされた読出し位置から所定長のビット列を読み出す。所定長は、例えば、圧縮に用いられた圧縮符号のうちの最大のビット長である。さらに、変換部1021は、S402で展開された圧縮伸張辞書データのうち、読み出したビット列に示される位置の葉のデータ構造体を読み出す(S503)。S503においては、まずヘッダの構造体Hから葉のデータ構造体Lの先頭アドレスを読み出す。読みだしたビット列に示される位置は、例えば、葉のデータ構造体Lの先頭アドレスからのオフセットが、各葉のデータ構造体のデータサイズ×読みだしたビット列で示される位置である。S503の処理で読み出される葉のデータ構造体には、文字情報(伸張文字情報)と圧縮符号長とが含まれている。
続いて、変換部1021は、S503の処理で読みだした文字情報を、記憶部11の記憶領域に書き込む(S504)。また、調整部1022は、S503の処理で読み出された圧縮符号長に示されるビット数だけ、読出し位置を進める(S505)。上述のS502〜S505の処理が繰り返し行なわれることで、圧縮データが伸張文字列に変換され、変換された伸張文字列が記憶部11に書き込まれる。
図17に示すS403の処理が行なわれると、伸張部102は、変換部1021により記憶部11に書き込まれた伸張文字情報群を含む伸張ファイルを生成する。S404で伸張ファイルが生成されると、図17に示す伸張処理のフローは終了となる(S405)。
さらに、コンピュータ1で行なわれる検索処理手順を説明する。
図19は、検索部103による検索処理のフローチャート例を示す。記憶部11に記憶された圧縮ファイルに対して、検索文字列を抽出させる検索要求を検索部103が受ける(S600)と、検索対象の圧縮ファイルが読み出される(S601)。さらに、検索部103は、S600で受けた検索要求を解析し、解析結果に応じて図20に示す圧縮伸張辞書データT10の照合フラグ領域にフラグをセットする(S602)。
図20は、検索処理に本実施形態の検索処理に対応した圧縮伸張辞書データT10を示す。図20に示すように、圧縮伸張辞書データT10は、図6に示す圧縮伸張辞書データT6に加えて、照合フラグ領域を有している。初期状態では、照合フラグ領域の各ビットは「0」にセットされる。本実施形態における照合フラグ領域のビットは、「0」の場合は「照合処理の必要なし」を示し、「1」の場合は「照合処理の必要あり」を示す。
検索部103は、例えば、S600で受けた検索要求に含まれる検索文字列の最初の文字情報に対応する照合フラグをセットする。例えば、検索文字列が「apple」であったとすると、圧縮伸張辞書データT10のうち、文字情報「a」に対応する照合フラグを「1」とする(図20参照)。
S602の処理が終わると、調整部1032は、調整部1022のS501の処理と同様に、圧縮ファイルからビット列を読み出す位置をセットする(S603)。続いて、探索部1031は、変換部1022のS502の処理と同様に、圧縮ファイル内に読み出されていないデータが存在するか否かを判定する(S604)。圧縮ファイル内に読み出されていないデータが存在しない場合(S604:NO)には、検索処理のフローが終了される(S610)。
圧縮ファイル内に読み出されていないデータが存在する場合(S604:YES)には、探索部1031は、圧縮ファイルから所定長のビット列を読み出す(S605)。所定長は、例えば、圧縮に用いられた圧縮符号のうちの最大のビット長である。さらに、探索部1031は、圧縮伸張辞書データT10のうち、S605の処理で読み出したビット列に対応する領域の照合フラグを参照する(S606)。探索部1031は、S606の処理で参照した照合フラグが「0」か「1」かについての判定を行なう(S607)。照合フラグが「1」にセットされている場合(S607:YES)には、照合部1033が検索文字列との照合処理を行なう(S608)。照合部1033による検索文字列との照合処理が行なわれるか、S607の判定において照合フラグが「0」にセットされている(S607:NO)と、調整部1032は、調整部1022のS505の処理と同様に、読出し位置の更新を行なう(S609)。調整部1032は、S606の参照処理で参照した領域に格納された符号長に基づいて読み出し位置を調整する。S609の処理が終わると、再度S604の処理が探索部1031によって行なわれる。
図21は、照合部1033による照合処理のフローチャート例を示す。図19のS608の処理が行なわれる(S700)と、調整部1033は、読出し位置を示す情報をコピーする(S701)。照合部1033は、コピーされた読み出し位置情報に基づいて、照合処理を行なう。照合部1033は、何文字目の照合であるかを示すカウンタの値iをインクリメントする(S702)。iの初期値は1とする。照合部1033は、符号長にもとづいてS701でコピーした読み出し位置の更新を行なう(S703)。初回の読み出し位置の更新は、S606で参照された領域の符号長に基づいて行なわれる。2回目以降の読み出し位置の更新は、後述するS705の処理で取得する符号長に基づいて行なわれる。
次に、照合部1033は、探索部1031のS605の処理と同様に、所定長ビット列の読み出しを行なう(S704)。照合部1031は、圧縮伸張辞書データT10のうち、S704で読み出したビット列に示される位置に格納された文字情報及び符号長を読み出す(S705)。次に、照合部1033は、検索文字列のi番目の文字情報を取得する(S706)。さらに、照合部1033は、S705で読み出した文字情報と、S706で取得した文字情報とが合致するか否かを判定する(S707)。S707の判定で、文字情報同士が合致しないと判定された場合(S707:NO)には、照合処理のフローは終了され(S710)、図19のS609の処理が行なわれる。
S707の判定で、文字情報同士が合致すると判定された場合(S707:YES)には、照合部1033は、S706で読み出された文字情報が検索文字列の末尾の文字であるか否かを判定する(S708)。S708の判定の結果、検索文字列の末尾でないと判定された場合(S708:NO)には、照合部1033が再度S702の処理を行なう。
S708の判定の結果、検索文字列の末尾であると判定された場合(S708:YES)には、照合部1033は、検索文字列に合致する文字情報が存在する位置として、読出し位置を記憶部11に記憶する(S709)。S709で記憶される読み出し位置は、例えば、S701でコピーされる元の読み出し位置か、S703において更新された読み出し位置かのいずれかを用いる。S709で読み出し位置が格納されると、図19のフローに戻り(S710)、図19のS609の処理が行なわれる。
図19に示す照合処理は、圧縮伸張辞書データT5を用いた場合にも行なうことができる。しかし、その場合には、S606の処理において、根のデータ構造体KRの参照によりポインタを読み出してから、葉のデータ構造体KLにアクセスして照合フラグを確認することとなる。圧縮伸張辞書データT5を用いて行なわれる照合処理と同様のルーチンにより、上述の圧縮伸張辞書データT6を用いた照合処理を実装することができる。
上述の実施形態において、1つの文字情報を16ビットで表現する文字コード系を用いて、2000種の文字情報を圧縮対象としたとする。また、圧縮対象の各文字情報に割り当てる圧縮符号の符号長は12ビットまでとする。
例えば、圧縮伸張辞書データT5においては用いられるポインタには、圧縮対象の文字情報の種類を判別する必要があるので、2000種以上を識別可能なビット数が必要となる。1バイト単位でデータを管理するメモリを用いた場合に、根のデータ構造体KRは、それぞれ2バイトの領域にポインタが格納されて構成される。一方、葉のデータ構造体KLのそれぞれに、16ビットの文字コードと符号長を記憶するので、3バイトの領域が設けられる。そのため、根のデータ構造体KR(2の12乗×2バイト)と葉のデータ構造体KL(2000×2バイト)とで、14キロバイト程度の記憶領域を必要とする。
圧縮伸張辞書データT6においては、葉のデータ構造体Lのそれぞれには、葉のデータ構造体KLと同様に3バイトの記憶領域が設けられる。そのため、2の12乗×3バイトで、12キロバイト程度の記憶領域が必要となる。
上述の例においては、圧縮対象の文字情報が1330文字程度あれば、圧縮伸張辞書データT6の方が圧縮伸張辞書データT5よりもデータサイズが小さい。
上記に説明される実施形態は一例であり、発明を実施しうる範囲内で適宜変形可能である。また、上記の説明された各処理のさらに詳細な内容については、当業者に周知の技術が適宜用いられる。