図1は、LZ77を利用した圧縮処理の流れを示す。まず、記憶領域A1、記憶領域A2および記憶領域A3が例えばメモリ内に確保される。図1に示すファイルF1内のコンテンツ部分のデータは、記憶領域A1にロードされる。記憶領域A1は、例えば符号化部などと呼ばれる。ファイルF1は、「・・・1st horse・・・2nd horse・・・3rd horse・・・」というデータが含まれる(「・・・」は不特定な文字列である)。記憶領域A1にロードされたデータに基づいて、圧縮データの生成処理(後述)が行なわれる。また、圧縮データの生成処理が行なわれたデータは、記憶領域A1から記憶領域A2にコピーされる。記憶領域A2は、例えば参照部と呼ばれる。圧縮データは、記憶領域A1にロードされたデータと記憶領域A2内のデータとの照合処理の結果に応じて生成される。生成された圧縮データは順次記憶領域A3に格納され、記憶領域A3に格納された圧縮データに基づいて圧縮ファイルF2が生成される。また、図1において、記憶領域A1およびA2内のデータは模式的に示されている。
図1に示される「1st horse・・・」の「h」以降が処理対象のデータである場合を例に圧縮データd1の生成を説明する。まず、記憶領域A2内で「horse・・・」の最長一致データが探索される(図1に示す「照合」)。図1の例において、処理対象のデータの先頭のデータである「h」と一致するデータが記憶領域A2に存在しない。処理対象のデータと一致するデータが記憶領域A2に存在しない場合には、処理対象のデータの先頭データをハフマン符号化/復号化アルゴリズムにより符号化して得られるハフマン符号を含む圧縮データd1が生成される。圧縮データとしてハフマン符号化を用いることは、あくまで一例であり、他の圧縮アルゴリズムが用いられてもよいし、先頭データそのものである非圧縮データが用いられてもよい。圧縮データd1には、最長一致データに基づく圧縮データでない旨を示す識別子(図1の例において「0」)が含まれる。
図1に示される「2nd horse・・・」の「h」以降が処理対象のデータである場合を例に圧縮データd2の生成を説明する。まず、記憶領域A2内で「horse・・・」の最長一致データが探索される(図1に示す「照合」)。図1の例では、「1st horse・・・」が記憶領域A2に存在するので、例えば、処理対象のデータの「horse」と記憶領域A2内の「1st horse・・・」の「horse」とが一致する。例えば、記憶領域A2内の一致データ「horse」が、記憶領域A2内で処理対象データと最も長く一致するデータ(最長一致データ)である場合には、最長一致データの記憶領域A2内での位置と、最長一致データのデータ長に基づき圧縮データd2が生成される。圧縮データd2には、最長一致データに基づく圧縮データである旨を示す識別子(図1の例において「1」)が含まれる。
図1に示される「3rd horse・・・」の「h」以降が処理対象のデータである場合を例に圧縮データd3の生成を説明する。まず、記憶領域A2内で「horse・・・」の最長一致データが探索される(図1に示す「照合」)。図1の例では、「1st horse・・・2nd horse」が記憶領域A2に存在するので、例えば、処理対象のデータの「horse」と記憶領域A2内の「1st horse」および「2nd horse」の「horse」とが一致する。例えば、記憶領域A2内の「1st horse」または「2nd horse」のいずれか「horse」が最長一致データである場合に、最長一致データの記憶領域A2内での位置と、最長一致データのデータ長に基づき圧縮データd3が生成される。圧縮データd3には、最長一致データに基づく圧縮データである旨を示す識別子(図1の例において「1」)が含まれる。
生成された圧縮データd1〜d3は、記憶領域A3に記憶され、圧縮ファイルF2の生成処理により、圧縮ファイルF2に含まれる。
図2は、LZ77を利用した伸張処理の流れを示す。伸張処理においては、圧縮ファイルF2内の圧縮データをメモリ(記憶領域B1)にロードし、ロードされた圧縮データの識別子に応じて伸張データの生成処理を行なう。図2の「*」は圧縮されたデータであることを示す。記憶領域B1は、例えば符号化部などと呼ばれる。最長一致データに基づく圧縮データでない旨を示す識別子(図1の例において「0」)を含む圧縮データ(図2における圧縮データd1など)を読み出した場合には、ハフマン符号化/復号化アルゴリズムに従った復号処理により、伸張データが生成される。生成された伸張データは、記憶領域B2および記憶領域B3の双方に格納される。記憶領域B2は、例えば参照部などと呼ばれる。
一方、最長一致データに基づく圧縮データである旨を示す識別子(図1の例において「1」)を含む圧縮データ(図2における圧縮データd2および圧縮データd3など)を読み出した場合には、圧縮符号に示される記憶領域B2内のデータが伸張データとなる。識別子が最長一致データに基づく圧縮データである旨を示す場合も、生成された伸張データは、記憶領域B2および記憶領域B3の双方に格納される。
伸張データを記憶領域B2に格納することにより、記憶領域B2が圧縮符号の生成処理が行なわれる際の記憶領域A2と同じ状態にすることができ、そのため圧縮符号に基づいて圧縮する前と同じデータが取得される。記憶領域B3に格納された伸張データに基づいて伸張ファイルF3が生成される。
図3は、UTF−8におけるコードの割り当てを示す。UTF−8においては、上述の通り、1〜4バイトの文字コードが用いられる。文字コードの長さに応じて、文字コードの値の範囲が定められている。
1バイトの文字コードは、0x00〜0x7Fの値で表現される。そのため、2進数表記では「0XXXXXXX」となり、先頭のビットが「0」となる(「X」には「0」か「1」かのいずれかの値である)。2バイトの文字コードは、1バイト目が0xC2〜0xDFの値であり(0xC0および0xC1は、例えば制御コードに用いられる)、2バイト目に0x80〜0xBFの値が用いられる。すなわち、2バイトの文字コードの1バイト目は「110YYYYX」であり、2バイト目は「10XXXXXX」である(「Y」は連続する「Y」のうちいずれか少なくとも1つが「1」であることを示す)。3バイトの文字コードは、1バイト目が0xE0〜0xEFの値であり、2バイト目及び3バイト目は0x80〜0xBFの値が用いられる。すなわち、3バイトの文字コードの1バイト目は「1110YYYY」であり、2バイト目は「10YXXXXX」であり、3バイト目は「10XXXXXX」である。4バイトの文字コードは、1バイト目が0xF0〜0xF7の値であり、2〜4バイト目は0x80〜0xBFの値が用いられる。すなわち、4バイト文字コードの1バイト目は「11110YYY」であり、2バイト目は「10YYXXXX」であり、3バイト目及び4バイト目はそれぞれ「10XXXXXX」である。
UTF−8のコード割り当てでは、2バイト以上の文字コードにおいて、1バイト目のデータと2バイト目以降のデータとは異なる値となる。図1における圧縮処理において、例えば、記憶領域A1内の3バイトの文字コードの1バイト目のデータと、記憶領域A2内の各データと照合が行なわれる。すると、記憶領域A2には、例えば、3バイトの文字コードの2バイト目のデータも、3バイト目のデータも含まれる。2バイト以上の文字コードにおいて、1バイト目のデータと2バイト目以降のデータとは異なる値となるUTF−8などの文字コード体系では、異なる値であることが明らかであるにも関わらず、1バイト目のデータと2バイト目以降のデータについての照合処理が行なわれてしまう。
LZ77を利用した圧縮(例えばZIPなどによる圧縮)は、圧縮対象のデータ間での照合結果が得られるデータであれば適用され得る。ZIPなどは、例えば、文書データや画像データなど異なる種別のデータに対しても汎用的に用いられる。種別を選ばず適用可能であるために、特定の種別のデータを対象とする改善が試みられにくい状況であった。しかしながら、特定の文字コード体系におけるデータ間の照合処理に対して敢えて詳細な手順を追尾することにより、上述のように異なる値になることが明らかなデータ間においても照合処理が行なわれることが明らかとなった。
上述のように、文字コードのデータ単位よりも細かいデータ単位で照合処理が行なわれることにより、不要な照合処理が発生してしまう。本実施形態においては、UTF−8などの文字コードのサイズが複数種類存在する文字コード系を用いたデータに対して、文字コードに対応したデータ単位の管理を行ない、さらに管理されたデータ単位ごとに照合が行なわれる。
また、異なる3バイト文字に対して、文字コードの境界を無視した圧縮符号化が行われることとなる。例えば「十一」(0xE2BC98E38692)と「十二」(0xE2BC98E386)との照合により、0xE2BC98E386(5バイト)が一致データ列として抽出され、圧縮符号が割り当てられることとなる。その場合には、文字コードの残りの部分(「十一」については、0x92)から照合の対象となり、文字コードの境界とずれたままの照合処理(「泣き別れ」)が発生してしまう。それにより圧縮率の低下が見込まれる。
図4は、圧縮処理の例を示す。まず、記憶領域A1、記憶領域A2、記憶領域A3および記憶領域A4が例えばメモリ内に確保される。図4に示すファイルF1内のコンテンツ部分のデータは、記憶領域A1にロードされる。記憶領域A1は、例えば符号化部などと呼ばれる。ファイルF1は、「・・・1st horse・・・2nd horse・・・3rd horse・・・」というデータが含まれる(「・・・」は不特定な文字列である)。
記憶領域A1にロードされたデータは、符号化辞書D1に基づいて固定長符号に変換される。変換で得られた固定長符号に基づいて圧縮データの生成処理が行なわれる。また、圧縮データが生成された固定長符号は記憶領域A2に格納される。記憶領域A2は、例えば参照部と呼ばれる。圧縮データは、変換により得られた固定長符号と記憶領域A2に格納された固定長符号との照合処理の結果に応じて生成される。生成された圧縮データは順次記憶領域A3に格納され、記憶領域A3に格納された圧縮データに基づいて圧縮ファイルF2が生成される。また、図4において、記憶領域A1およびA2内のデータは模式的に示されている。
図4の例においては、記憶領域A1から文字コードL1が読み出され、読み出された文字コードL1に対応する固定長符号M1が符号化辞書D1から読み出される。読み出された固定長符号M1は、記憶領域A4に格納される。記憶領域A4に格納された固定長符号M1に基づいて、記憶領域A2内に格納された固定長符号に対して順次照合処理が行なわれる。記憶領域A4に格納された固定長符号M1と一致する固定長符号N1が記憶領域A2内に存在する場合には、さらに記憶領域A1から文字コードL2が読み出され、読み出された文字コードL2に対応する固定長符号M2が符号化辞書D1から読み出されて記憶領域A4に格納される。さらに、記憶領域A2内で固定長符号N1に後続する固定長符号N2が固定長符号M2と一致するかが判定される。一致すれば、さらに文字コードが記憶領域A1から読み出され同様の手順が繰り返される。上述の手順は、一致しない固定長符号が得られるか、連続して一致する固定長符号の数が下限値(例えば、所定の符号数)Lminを超えるまで繰り返される。記憶領域A2全体に渡って同様の処理が行なわれ、記憶領域A2の中から最も長く一致する固定長符号の列(最長一致固定長符号列)が抽出される。
最長一致固定長符号列が下限値Lmin以上の長さである場合には、圧縮データd11が生成される。圧縮データd11は、最長一致固定長符号列に基づく圧縮符号である旨を示す識別子(図4の例では「1」)と、最長一致固定長符号列の長さ(例えば最長一致固定長符号列に含まれる固定長符号の数)と最長一致固定長符号列の位置とを示す圧縮符号とを含む。最長一致固定長符号列の位置は、記憶領域A2の更新位置から固定長符号何個分離れた位置であるかを示す符号の個数などで示される。さらに、記憶領域A4に格納された固定長符号列が記憶領域A2に書き込まれる。記憶領域A2の全領域に固定長符号が書き込まれている場合には、記憶領域A2に格納された固定長符号のうち、記憶領域A2に最も先に格納された固定長符号に、記憶領域A4に格納されている固定長符号列が上書きされる。
最長一致固定長符号列が下限値Lminよりも短い場合には、圧縮データd12が生成される。圧縮データd12は、最長一致固定長符号列に基づく圧縮符号でない旨を示す識別子(図4の例では「0」)と、固定長符号M1とを含む。さらに、固定長符号M1が記憶領域A2に書き込まれる。記憶領域A2の全領域に固定長符号が書き込まれている場合には、記憶領域A2に格納された固定長符号のうち記憶領域A2に最も先に格納された固定長符号に、固定長符号M1が上書きされる。
上述の手順で圧縮データが生成され、生成されるたびに記憶領域A3に書き込まれる。記憶領域A3に格納された圧縮データに基づいて圧縮ファイルF2が生成される。符号化辞書D1も圧縮ファイルF2に含まれるか、または、符号化辞書D1は他の方法によって圧縮ファイルF2を伸張するコンピュータに渡される。さらに詳細な圧縮処理の手順については後述される。
図5は、符号化辞書D1の例を示す。符号化辞書D1は、文字コードと固定長符号との対応関係を示す。図5に示す符号化辞書D1は、日本語の文書を対象とした符号化辞書の例である。図5の例においては、固定長符号の符号長は12ビットである。また、図5の例においては、各文字コードに対して4バイトずつ格納領域が設けられ、文字コードが格納された位置を示す情報が固定長符号として用いられる。例えば、符号化辞書D1内の先頭に「NUL」のコードが格納されているため、「NUL」のコード(0x00)に対応する固定長符号が「0x000」とする。また、例えば「a」の文字コード(0x41)は符号化辞書D1の先頭から、4バイト×32(16進数表記では0x020)の位置に存在するため、「a」の文字コードに対応する固定長符号は「0x020」となる。
符号化辞書D1では、各文字コードに対して固定長の符号が割り当てられる。符号長をmビットとすると、固定長符号が割り当てられる文字コードの数は2のm乗となる。図5の例においては符号長が12ビットなので、4096種類の文字コードに符号長が割り当てられる。ファイルF1に使用される文字コード系の全文字コードに対して固定長符号を割り当ててもよいし、一部の文字コードに圧縮符号を割り当てることとしてもよい。一部の文字コードに固定長符号を割り当てる場合の制御は後述される。
図6は、符号化辞書D2の例を示す。符号化辞書D2は、文字コードまたは文字コード列と固定長符号との対応関係を示す。図6に示す符号化辞書D2は、英語の文書を対象とした符号化辞書の例である。図6の例においては、固定長符号の符号長は12ビットである。また、図6の例においては、文字コードまたは文字コード列に対して所定長の格納領域が設けられ、文字コードまたは文字コード列が格納された位置を示す情報が固定長符号として用いられる。
図6に示す符号化辞書D2においても、例えば、「NUL」や「a」に対して、図5に示す符号化辞書と同様の固定長符号が割り当てられる。符号化辞書D2においては、さらに、基礎的な英単語に対しても固定長符号が割り当てられる。図6に示す通り、英単語「one」に対し、例えば固定長符号「0x100」が割り当てられる。
図4に示す圧縮処理において、記憶領域A4に格納する固定長符号を生成するにあたって、記憶領域A1の読出し位置に存在するデータ列と合致するデータ列に対応する固定長符号が符号化辞書D2(図4における符号化辞書D1に対応)から抽出され、記憶領域A4に格納される。この際、例えば、記憶領域A1の読出し位置に「are」という単語が存在すると、固定長符号0x020(「a」の文字コード)も固定長符号0x180(「are」の文字コード)も抽出されるが、例えば、固定長符号0x000〜0x0FFよりも0x100〜0xFFFが優先されると予め定めておく。
英語の文書には、基礎的な単語を高頻度で使用する傾向がある。英語の文書中に含まれる英単語の約半分が、約千語の基礎的な単語で占められる。そのため、図6に示す符号化辞書D2のように12ビットの固定長を割り当てられる英単語群であれば、英語の文書をほぼ表現しうる。図6に示す符号化辞書D2を用いることで、複数回の1バイト単位の照合処理で処理されるデータ量が、一度の照合で処理される。さらに、その一度の照合においても照合対象のデータサイズは固定長符号の符号長にとどめられる。そのため、図6に示す符号化辞書D2を用いて符号化された固定長符号化同士の照合を行なうことにより、圧縮速度が向上する。
図7は、伸張処理の例を示す。まず、記憶領域B1、記憶領域B2および記憶領域B3機構領域が例えばメモリ内に確保される。図7に示す圧縮ファイルF2内の圧縮データは、記憶領域B1にロードされる。記憶領域B1は、例えば符号化部などと呼ばれる。また、圧縮ファイルF2からメモリに符号化辞書D1がロードされる。上述したように、符号化辞書D1は圧縮ファイルF2内に含まれていなくても、圧縮に用いた符号化辞書D1が事前に保持されていてもよい。
記憶領域B1にロードされた圧縮データは順次読み出される。読み出された圧縮データは、圧縮データに含まれる識別子に応じた伸張処理が行なわれる。識別子が、最長一致固定長符号列に基づく圧縮符号でない旨を示す識別子(図7の例では「0」)である場合の圧縮データの例として、圧縮データd12が図7に例示される。圧縮データd12に含まれる固定長符号M1は、符号化辞書D1に基づいて復号化される。また、圧縮データd12内の固定長符号M1が記憶領域B2の更新位置に書き込まれる。符号化辞書D1に基づく復号化により得られた文字コードd22は、記憶領域B3に書き込まれる。
識別子が、最長一致固定長符号列に基づく圧縮符号である旨を示す識別子(図7の例では「1」)である場合の圧縮データの例として、圧縮データd11が図7に例示される。圧縮データd11に含まれる最長一致固定長符号列の長さおよび位置の情報に基づいて、記憶領域B2から固定長符号列d21(例えば、固定長符号列M1〜Mn)が読み出される。固定長符号列d21が読み出されると、固定長符号列d21が記憶領域B2の更新位置に書き込まれるととともに、符号化辞書D1を用いて復号化される。復号化により得られた文字コード列d23(例えば、固定長符号列M1〜Mnに対応する文字コード列L1〜Ln)は記憶領域B3に書き込まれる。
記憶領域B2の更新位置への書込みにおいて、記憶領域B2の全領域に固定長符号が書き込まれている場合には、記憶領域B2に格納された固定長符号のうち、記憶領域B2に最も先に格納された固定長符号に対する上書きにより書込みが行なわれる。
記憶領域B3に順次書き込まれるデータ(文字コード)に基づいて、伸張ファイルF3が生成される。さらに詳細な伸張処理の手順については後述される。
図8は、機能構成例を示す。本実施形態の処理を実行するコンピュータ1は、記憶部13を含み、さらに、圧縮部11と伸張部12との少なくとも一方を含む。圧縮部11は圧縮処理を行ない、伸張部12は伸張処理を行なう。記憶部13は、圧縮対象のファイルF1や、圧縮処理により得られる圧縮ファイルF2や、ファイルF2を伸張して得られるファイルF3などを格納する。例えば、記憶部13は、圧縮辞書D1を記憶する。また、記憶部13は、圧縮部11や伸張部12のワークエリアとして用いられる。圧縮部11は、制御部111、照合部112、更新部113および変換部114を含む。伸張部12は、制御部121、参照部122、更新部123および変換部124を含む。
制御部111は、照合部112および更新部113を制御して、圧縮機能を実現させる。また、制御部111は、各機能部の処理に用いるデータを保持するため、記憶部13に記憶領域(例えば、上述の記憶領域A1、記憶領域A2および記憶領域A3)を確保する。制御部111は、順次記憶領域A1内の読出し位置のデータを読み出す。変換部114は、制御部111が読みだしたデータを符号化辞書D1に基づいて固定長符号に変換する。制御部111は変換部114により変換された固定長符号を記憶領域A4に格納する。照合部112は、記憶領域A4内の固定長符号に基づいて、記憶領域A2内の固定長符号の参照処理を実行する。更新部113は、記憶領域A4内の固定長符号に基づいて、記憶領域A2内の固定長符号列を更新する。制御部111は、照合部112による記憶領域A2内の参照結果に応じて、圧縮データを生成する。圧縮部11内の各機能部による処理の実行手順については後述する。
制御部121は、参照部122および更新部123を制御して、伸張機能を実現させる。また、制御部121は、各機能部の処理に用いるデータを保持するため、記憶部13に記憶領域(例えば、上述の記憶領域B1、記憶領域B2および記憶領域B3)を確保する。制御部121は、記憶領域B1内の読出し位置の圧縮データを読み出し、読みだした圧縮データに含まれる識別子を判定する。制御部121は、識別子が所定の識別子である場合に、参照部122に、記憶領域B2内の固定長符号の参照処理を実行させる。参照部122による参照か、記憶領域B3からの読出しにより固定長符号が得られると、更新部123は、得られた固定長符号に基づいて記憶領域B2の更新を行なう。また、変換部124は、得られた固定長符号を符号化辞書D1に基づいて伸張データに変換する。伸張部12内の各機能部による処理の実行手順については後述する。
図9は、記憶領域の位置情報の管理に用いられる位置情報テーブルT1の例を示す。位置情報テーブルT1は、圧縮処理に用いられる各記憶領域(記憶領域A1、記憶領域A2および記憶領域A3など)の記憶部13における位置の管理に用いられる。位置情報テーブルT1には、ファイルF1をロードする記憶領域A1の開始位置P1、終了位置P2および読出し位置P3が含まれる。また、位置情報テーブルT1には、記憶領域A2の開始位置P4、終了位置P5、参照位置P6および更新位置P7が含まれる。さらに、位置情報テーブルT1には、記憶領域A3の開始位置P8、終了位置P9および書込み位置P10が含まれる。位置情報テーブルT1に格納されるそれぞれの位置情報の初期値は、制御部111により設定される。各記憶領域の開始位置と終了位置は、圧縮や伸張の対象となるデータ(例えば、ファイル内のヘッダやトレーラ部分を除いた部分)の格納開始位置、終了位置を示す。例えば、読出し位置P3と開始位置P1との初期値は同じであり、参照位置P6および更新位置P7と開始位置P4との初期値は同じであり、書込み位置P10と開始位置P8との初期値は同じである。
以下に圧縮処理の手順について説明する。
図10は、圧縮処理の手順例を示す。まず、コンピュータ1内のオペレーティング・システムやアプリケーションプログラムの動作により圧縮機能が呼び出される(S101)。圧縮機能が呼び出されると、制御部111は、例えば、図1に示す記憶領域A1、記憶領域A2、記憶領域A3、および記憶領域A4の確保や、各記憶領域内の各位置情報(例えば、図9に示す各位置情報)の設定などの前処理を実行する(S102)。
S102の処理を終えると、制御部111は、圧縮対象のファイルF1のコンテンツ部分を記憶領域A1にロードする(S103)。また、制御部111は、ファイルF1の終端に基づいて終了位置P2を設定する。次に、制御部111は、最長一致固定長符号列の探索処理を実行する(S104)。
図11は、最長一致固定長符号列の探索処理の手順例を示す。最長一致固定長符号列の探索処理が開始される(S200)と、制御部111は、参照位置P6、一致長Laおよび最長一致位置Paの初期値をセットする(S201)。参照位置P6及び最長一致位置Paは、開始位置P4と同じか、もしくは更新位置P7と同じにセットされる。一致長Laは例えば、「0」などにセットされる。制御部111は、さらにカウンタ値jを初期値(例えばj=0)にセットする(S202)。
次に、制御部111は、記憶領域A4に固定長符号M(j)が存在するか否かを判定する(S203)。固定長符号M(j)は、記憶領域A4のj番目の位置に格納される固定長符号を意味する。記憶領域A4に固定長符号M(j)が存在しない場合(S203:No)には、制御部111は、変換部114に固定長符号M(j)の取得処理を実行させる(S204)。
図12は、固定長符号の取得処理の手順例を示す。変換部114は、制御部111に固定長符号M(j)の取得処理を指示される(S300)と、記憶領域A1の読出し位置P3に存在する文字コードを読み出す(S301)。1バイト文字なら1バイトのデータが読み出され、2バイト文字なら2バイト文字が読み出される。次に、変換部114は、S301で読みだした文字コードに基づき、S301で読みだした文字コードに対応する固定長符号を符号化辞書D1から読み出す(S302)。さらに、変換部114は、位置情報テーブルに格納された読出し位置P3を示す情報を更新する(S303)。S303の更新は、S301で変換部114が読み出したデータの長さに基づいて行なわれる。例えば、1バイト文字が読み出されれば、読出し位置P3は1バイト移動される。制御部111は、S302で読みだした固定長符号を記憶領域A4のj番目の位置に格納する(S304)。上述の通り、記憶領域A4のj番目の位置に格納される固定長符号は、固定長符号M(j)である。変換部114は、固定長符号M(j)を記憶領域に格納すると、固定長符号の取得処理を終了する(S305)。
図11の説明に戻る。記憶領域A4に固定長符号M(j)が存在するか(S203:Yes)、S204の固定長符号の取得処理が終了した場合に、制御部111は、照合部112に照合処理を実行させる(S205)。S205において、照合部112は、記憶領域A4に格納された固定長符号M(j)と、記憶領域A2内で参照位置P6からカウンタ値jに応じて移動させた位置に存在する固定長符号とが一致するか否かを判定する。参照位置P6からカウンタ値jに応じて移動させた位置とは、具体的には、固定長符号の符号長がmビットであれば、参照位置P6からm×jビットずれた位置である。
S205の判定で固定長符号同士が合致した場合(S205:Yes)には、制御部111は、カウンタ値jのインクリメントを行なう(S206)。次に、制御部111は、カウンタ値jが上限値Lmaxに達した(j=Lmax)か否かを判定する(S207)。上限値Lmaxは、一致長Laの上限値として設定される値である。一致長Laの表現に用いられるビット数がm1と圧縮符号のフォーマットで定められている場合には、例えば、2のm1乗―1が上限値として設定される。カウンタ値jが上限値Lmaxに達していない場合(S207:No)には、制御部111は、S203の処理を実行する。また、カウンタ値jが上限値Lmaxに達している場合(S207:Yes)には、制御部111は、一致長Laにカウンタ値jを代入し、最長一致位置Paに参照位置P6を代入する(S208)。図11のS208の処理に示す「=」は代入演算子を示す。
S205の判定で固定長符号同士が合致しない場合(S205:No)には、制御部111は、カウンタ値jが一致長Laよりも大きいか否かを判定する(S209)。カウンタ値jが一致長Laよりも大きい場合(S210)には、制御部111は、一致長Laにカウンタ値jを代入し、最長一致位置Paに参照位置P6を代入する(S210)。図11のS210の処理に示す「=」は代入演算子を示す。カウンタ値jが一致長La以下であるか(S209:No)、S210の処理が行なわれると、制御部111は、記憶領域A2内の参照位置P6の値をインクリメントする(S211)。具体的には、記憶領域A2に格納される固定長符号の符号長を単位としてインクリメントされ、固定長符号の符号長がmビットであれば参照位置P6はmビット移動される。次に、制御部111は、参照位置P6が記憶領域A2の終点位置P5に達したか否かを判断する(S212)。S212の判定において、参照位置P6が終点位置P5に達していない場合(S212:No)には、制御部111は、S202の処理を行なう。
制御部111は、S208の処理が行なわれるか、参照位置P6が終点位置P5に達している場合(S212:Yes)には、最長一致固定長符号列の探索処理を終了する(S213)。S104の探索処理の結果得られる最長一致固定長符号列は、S104の処理が終了した時点における記憶領域A2内の最長一致位置Paから一致長Laの範囲内の固定長符号列である。一致長Laは一致した符号の数を示すので、固定長符号列の符号長がmビットであれば、最長一致固定長符号列はLa×mビットの長さとなる。
続いて、制御部111は、S104の探索処理の結果に基づいて圧縮データの生成・書込み処理を実行する(S105)。
図13は、圧縮データの生成・書込み処理の手順例を示す。圧縮データの生成・書込み処理が開始される(S400)と、制御部111は、一致長Laが下限値Lmin以上であるか否かを判定する(S401)。下限値Lminは、一致長Laの下限値として設定される値である。例えば、一致長Laの表現に用いられるビット数がm1であり、最長一致位置Paの表現に用いられるビット数がm2であると圧縮符号のフォーマットで定められている場合に、La×m<m1+m2となり得る。その場合には、最長一致固定長符号列を利用した圧縮符号により生成される圧縮データのデータサイズよりも、固定長符号列を用いて生成される圧縮データのデータサイズの方が小さい。そこで、例えば、下限値Lmin以上の一致長Laであれば、La×m≧m1+m2となるように、下限値Lminは設定される。下限値Lminの設定は、他の設定(例えば、m1、m2およびmなどの値の設定)などに応じて調整される。
一致長Laが下限値Lmin以上である場合(S401:Yes)には、制御部111は、識別子「1」の情報を生成する(S402)。続いて、制御部111は、一致長Laを示すm1ビットの情報、および最長一致位置Paを示すm2ビットの情報を生成する(S403)。S403において、制御部111は、例えば、識別子「1」、一致長Laおよび最長一致位置Paの順序で連続する情報を生成する。次に、制御部111は、移動量Lcに一致長Laを代入する(S404)。移動量Lcは、圧縮データの生成により、圧縮処理が行なわれた固定長符号の符号数を示す。一致長Laに対応する個数の固定長符号がS403により生成される圧縮符号に変換されるので、移動量Lcは一致長Laと同じである。
一致長Laが下限値Lminよりも短い場合(S401:No)には、制御部111は、識別子「0」の情報を生成する(S405)。続いて、制御部111は、記憶領域A4に格納された固定長符号M(0)の読み出しを行なう(S406)。S406において、制御部111は、S405で生成した識別子「0」と記憶領域A4から読み出した固定長符号M(0)を連続させた情報を生成する。さらに、制御部111は、移動量Lcに1を代入する(S407)。
S404またはS407の処理が行なわれると、制御部111は、圧縮データの書込み位置P10に圧縮データを書き込む(S408)。圧縮データは、S404またはS408により生成される情報である。さらに、制御部111は、S408で書き込まれる圧縮データの長さに応じて、書込み位置P10の更新を行なう。例えば、圧縮データの長さは、S404で生成される圧縮データであれば、1+m1+m2ビットである。また、S408で生成される圧縮データの長さは、例えば1+mビットである。S409の処理が行なわれると、制御部111は、圧縮データの生成・書込み処理を終了する(S410)。
図10に戻って説明を続けると、圧縮データが生成され、書込み処理が行なわれると、制御部111は、記憶領域A2の更新処理を更新部113に実行させる(S106)。
図14は、記憶領域A2の更新処理の手順例を示す。更新部113は、制御部111に記憶領域A2の更新処理を指示される(S500)と、カウンタ値iを初期値(i=0)にセットする(S501)。次に、更新部113は、記憶領域A2の更新位置P7からカウンタ値iに応じて移動された位置に、記憶領域A4に格納された固定長符号M(i)を書き込む(S502)。具体的には、S502で書き込まれる位置は、固定長符号の符号長mとすると、更新位置P7からm×iビットずれた位置である。言い換えると、S502で書き込まれる位置は、更新位置P7を固定長符号の符号長mを単位として表現すると、P7+iで表される位置である。
次に、更新部113は、カウンタ値iが移動量Lcから1引いた値に達したか否かを判定する(S503)。カウンタ値iが移動量Lcから1引いた値になるまで処理が行なわれることによって、記憶領域A4に格納された固定長符号のうち、圧縮符号への変換が行なわれた固定長符号について、記憶領域A2に反映される。
カウンタ値iが移動量Lcから1引いた値に達していない場合(S503:No)に、更新部113はカウンタ値iをインクリメントする(S504)。さらに、S504でインクリメントされたカウンタ値iに基づいて、更新位置P7+カウンタ値iが記憶領域A2の終了位置P5に達しているかを判断する(S505)。更新位置P7+カウンタ値iが記憶領域A2の終了位置P5に達している場合(S505:Yes)は、更新部113は、更新位置P7に、記憶領域A2の開始位置P4からカウンタ値iを引いた値を代入する(S506)。S505およびS506の処理により、記憶領域A2外にはみ出して固定長符号が格納されることもなく、記憶領域A2が繰り返し使用される。更新位置P7+カウンタ値iが記憶領域A2の終了位置P5に達していない場合(S505:No)か、S506の処理が行なわれた場合には、更新部113は、S502の処理を行なう。
カウンタ値iが移動量Lcから1引いた値に達した場合(S503:Yes)に、更新部113は、記憶領域A2の更新位置P7を更新する(S507)。具体的には、更新位置P7に、更新位置P7に移動量Lcを加算した値が代入される。S507の処理を終えると、更新部113は、記憶領域A2の更新処理を終了する(S508)。
図10に戻って説明を続けると、制御部111は、更新部113による記憶領域A2の更新処理が終了すると、更新部113に記憶領域A4の更新処理を実行させる(S107)。
図15は、記憶領域A4の更新処理の手順例を示す。更新部113は、制御部111に記憶領域A4の更新処理を指示される(S600)と、記憶領域A4内の固定長符号M(0)〜M(Lc−1)を削除する(S601)。固定長符号M(0)〜M(Lc−1)に対応する圧縮データは既に生成され、且つ記憶領域A2にコピーされている。さらに、更新部113は、カウンタ値kの初期値(k=0)をセットする(S602)。
次に、更新部113は、固定長符号M(Lc+k)が存在するか否かを判断する(S603)。固定長符号M(Lc+k)が存在する場合(S603:Yes)に、更新部113は、記憶領域A4内で固定長符号M(Lc+k)をカウンタ値kの位置にコピーする(S604)。すなわち、更新部113は固定長符号M(k)を記憶領域A4に格納する。さらに、更新部113は、固定長符号M(Lc+k)を削除する(S605)。次に更新部113は、カウンタ値kをインクリメントする(S606)。S606の処理が行なわれると、更新部113は、S603の処理を行なう。また、S603の判定において、固定長符号M(Lc+k)が存在しない場合(S603:No)に、更新部113は、記憶領域A4の更新処理を終了する(S607)。
更新部113による記憶領域A4の更新処理が終了すると、制御部111は、ファイルF1の終点まで圧縮処理が終了したか否かを判定する(S108)。S108において、例えば記憶領域A1の読出し位置P3が、記憶領域A1の終了位置P2に達したか否かが判定される。ファイルF1の終点まで圧縮処理が終了していない場合(S108:No)には、制御部111は、S104の処理を行なう。一方、ファイルF1の終点まで圧縮処理が終了した場合(S108:Yes)には、制御部111は、記憶領域A3内に格納された圧縮データ群に基づいて、圧縮ファイルF2の生成処理を行なう(S109)。すなわち、圧縮ファイルF2がクローズされ、記憶部13内に格納される。S109の処理が終了すると、制御部111は、圧縮処理を終了する(S110)。S110の処理において、制御部111は、例えば、圧縮機能の呼び出し元に対して、圧縮処理の終了通知を行なう。圧縮処理の終了通知には、例えば、圧縮ファイルF2の格納先を示す情報などが含まれる。
図16は、記憶領域の位置情報の管理に用いられる位置情報テーブルT2の例を示す。位置情報テーブルT2は、伸張処理に用いられる各記憶領域(記憶領域B1、記憶領域B2および記憶領域B3など)の記憶部13における位置の管理に用いられる。位置情報テーブルT2には、圧縮ファイルF2がロードされる記憶領域B1の開始位置Q1、終了位置Q2および読出し位置Q3が含まれる。また、位置情報テーブルT2には、記憶領域B2の開始位置Q4、終了位置Q5、参照位置Q6および更新位置Q7が含まれる。さらに、位置情報テーブルT2には、記憶領域B3の開始位置Q8、終了位置Q9および書込み位置Q10が含まれる。位置情報テーブルT2に格納されるそれぞれの位置情報の初期値は、制御部111により設定される。各記憶領域の開始位置と終了位置は、圧縮や伸張の対象となるデータ(例えば、ファイル内のヘッダやトレーラ部分を除いた部分)の格納開始位置、終了位置を示す。例えば、読出し位置Q3と開始位置Q1との初期値は同じであり、参照位置Q6および更新位置Q7の初期値は、開始位置Q4と同じであり、書込み位置Q10と開始位置Q8との初期値は同じである。
以下に伸張処理の手順について説明する。
図17は、伸張処理の手順例を示す。まず、コンピュータ1内のオペレーティング・システムやアプリケーションプログラムの動作により伸張機能が呼び出される(S700)。伸張機能が呼び出されると、制御部121は、例えば、図2に示す記憶領域B1、記憶領域B2、記憶領域B3および記憶領域B4の確保、各記憶領域内の各位置情報(例えば、図16に示す各位置情報)の設定などの前処理を実行する(S701)。
S701の処理を終えると、制御部121は、圧縮ファイルF2のコンテンツ部分を記憶領域B1にロードする(S702)。また、制御部121は、圧縮ファイルF2の終端に基づいて終了位置Q2を設定する。次に、制御部121は、記憶領域B1の読出し位置Q3の圧縮データに含まれる識別子が、最長一致データ列に基づく圧縮データでないこと(識別子「0」)を示すか、最長一致データ列に基づく圧縮データであること(識別子「1」)を示すかを判定する(S703)。
識別子が「0」である場合(S703:Yes)は、制御部121は、読出し位置Q3の圧縮データに含まれている固定長符号を読出し、記憶領域B4に格納する(S704)。例えば、記憶領域B4に格納する固定長符号を固定長符号M(0)などとする。また、変換対象の固定長符号の数を示す移動量Lcは、1とする(Lc=1)。
識別子が「1」である場合(S703:No)は、制御部121は、参照部122に、読出し位置Q3の圧縮データに含まれる位置Paおよび長さLaに基づき、記憶領域B2を参照させる。参照部122は、記憶領域B2の位置Paから長さLaの固定長符号列を読出し、記憶領域B4に格納する(S705)。記憶領域B4に格納される固定長符号列をM(0)〜M(Lc−1)とする。S705において、制御部121は、移動量LcをLaに設定する(Lc=La)。
S704またはS705が行なわれると、制御部121は、変換部124に、記憶領域B4内に格納された固定量符号M(0)〜M(Lc−1)のそれぞれについて、符号化辞書D1に基づく変換を実行させる(S706)。S704において、変換部124は、固定長符号の値に基づいて、符号化辞書D1内の位置を特定し、伸張データ(文字コード)を読み出す。図5の符号化辞書D1の例によれば、固定長符号の値が0x020である場合は、「a」の文字コードが読み出される。
S706で伸張データが読み出されると、制御部121は、読み出された伸張データのそれぞれを記憶領域B3の書込み位置Q10に書き込む(S707)。さらに、制御部121は、書き込まれた伸張データの長さに応じて、書込み位置Q10を更新する。S707の処理が行なわれると、制御部121は、更新部123に記憶領域B2の更新を実行させる(S708)。
図18は、記憶領域B2の更新処理の手順例を示す。更新部123は、制御部121に記憶領域B2の更新処理を指示される(S800)と、カウンタ値iを初期値(i=0)にセットする(S801)。次に、更新部123は、記憶領域B2の更新位置Q7からカウンタ値iに応じて移動された位置に、記憶領域B4に格納された固定長符号M(i)を書き込む(S802)。具体的には、S802で書き込まれる位置は、固定長符号の符号長mとすると、更新位置Q7からm×iビットずれた位置である。言い換えると、S802で書き込まれる位置は、更新位置Q7を固定長符号の符号長mを単位として表現すると、Q7+iで表される位置である。
次に、更新部123は、カウンタ値iが移動量Lcから1引いた値に達したか否かを判定する(S803)。カウンタ値iが移動量Lcから1引いた値になるまで処理が行なわれることによって、記憶領域B4に格納された固定長符号のそれぞれが記憶領域B2に反映される。
カウンタ値iが移動量Lcから1引いた値に達していない場合(S803:No)に、更新部123はカウンタ値iをインクリメントする(S804)。さらに、更新部123は、S804でインクリメントされたカウンタ値iに基づいて、更新位置Q7+カウンタ値iが記憶領域B2の終了位置Q5に達しているかを判断する(S805)。更新位置Q7+カウンタ値iが記憶領域B2の終了位置Q5に達している場合(S805:Yes)は、更新部123は、更新位置Q7に、記憶領域B2の開始位置Q4からカウンタ値iを引いた値を代入する(S806)。S805およびS806の処理により、記憶領域B2外にはみ出して固定長符号が格納されることもなく、記憶領域B2が繰り返し使用される。更新位置Q7+カウンタ値iが記憶領域B2の終了位置Q5に達していない場合(S805:No)か、S806の処理が行なわれた場合には、更新部123は、S802の処理を行なう。
カウンタ値iが移動量Lcから1引いた値に達した場合(S803:Yes)に、更新部123は、記憶領域B2の更新位置Q7を更新する(S807)。具体的には、更新位置Q7に、更新位置Q7に移動量Lcを加算した値が代入される。S807の処理を終えると、更新部123は、記憶領域B2の更新処理を終了する(S808)。S808において、更新部123は、記憶領域B4内の情報をクリアする。
更新部123による記憶領域B2の更新処理が終了すると、制御部121は、伸張処理が圧縮ファイルF2の終点に達しているか判断する(S709)。S709は、例えば、記憶領域B1の読出し位置Q3が記憶領域B1の終了位置Q2に達しているか否かに応じて判断される。読出し位置Q3が終了位置Q2に達していない場合(S709:No)には、制御部121は、S703の処理を実行する。読出し位置Q3が終了位置Q2に達した場合(S709:Yes)には、制御部121は、記憶領域B3に格納された伸張データを用いて伸張ファイルF3を生成し、記憶部13に格納する(S710)。すなわち伸張ファイルF3をクローズする。S710の処理が終了すると、制御部121は、伸張処理を終了する(S711)。S711の処理において、制御部121は、例えば、伸張機能の呼び出し元に対して、伸張処理の終了通知を行なう。伸張処理の終了通知には、例えば、伸張ファイルF3の格納先を示す情報などが含まれる。
下記に、本実施形態に用いられるハードウェア及びソフトウェアについて説明する。
図19は、コンピュータ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を介した通信の制御を行なう回路である。通信インターフェース310は、例えばネットワークインターフェースカード(NIC)などである。SANインターフェース311は、ストレージエリアネットワークによりコンピュータ1と接続された記憶装置との通信の制御を行なう回路である。SANインターフェース311は、例えばホストバスアダプタ(HBA)などである。
入力デバイス307は、操作に応じて入力信号を送信する装置である。入力信号は、例えば、キーボードやコンピュータ1の本体に取り付けられたボタンなどのキー装置や、マウスやタッチパネルなどのポインティングデバイスである。出力デバイス309は、コンピュータ1の制御に応じて情報を出力する装置である。出力デバイス309は、例えば、ディスプレイなどの画像出力装置(表示デバイス)や、スピーカーなどの音声出力装置などである。また、例えば、タッチスクリーンなどの入出力装置が、入力デバイス307及び出力デバイス309として用いられる。また、入力デバイス307及び出力デバイス309は、コンピュータ1と一体になっていてもよいし、コンピュータ1に含まれず、例えば、コンピュータ1に外部から接続する装置であってもよい。
例えば、プロセッサ301は、ROM303や記憶媒体305に記憶されたプログラムをRAM302に読み出し、読み出されたプログラムの手順に従って圧縮部11の処理または伸張部12の処理を行なう。その際にRAM302はプロセッサ301のワークエリアとして用いられる。記憶部13の機能は、ROM303および記憶媒体305がプログラムファイル(後述のアプリケーションプログラム24、ミドルウェア23およびOS22など)やデータファイル(圧縮対象のファイルF1、圧縮ファイルF2および伸張ファイルF3など)を記憶し、RAM302がプロセッサ301のワークエリアとして用いられることによって実現される。プロセッサ301が読み出すプログラムについては、図20を用いて後述する。
図10〜図15の処理を実行する圧縮部11内の各機能ブロックについて、さらに説明する。制御部111は、プロセッサ301がRAM302の制御(排他制御など)や、RAM302へのアクセス処理や、アクセス処理で得られた情報に対する演算や、プロセッサ301内での演算処理などを行なうことにより実現される。照合部112は、プロセッサ301がRAM302へのアクセス処理や、アクセス処理により得られた情報に対する照合の演算などを行なうことにより実現される。更新部113は、プロセッサ301によるRAM302へのアクセス処理などを行なうことにより実現される。変換部114は、プロセッサ301によるRAM302へのアクセス処理や、アクセス処理により得られた情報に対する照合の演算等を行なうことにより実現される。
図17および図18の処理を実行する伸張部12内の各機能ブロックについて、さらに説明する。制御部121は、プロセッサ301がRAM302の制御(排他制御など)や、RAM302へのアクセス処理や、アクセス処理で得られた情報に対する演算や、プロセッサ301内での演算処理などを行なうことにより実現される。参照部122は、プロセッサ301がRAM302へのアクセス処理などを行なうことにより実現される。更新部123は、プロセッサ301によるRAM302へのアクセス処理などを行なうことにより実現される。変換部124は、プロセッサ301によるRAM302へのアクセス処理や、アクセス処理により得られた情報に対する照合の演算等を行なうことにより実現される。
図20は、コンピュータ1で動作するプログラムの構成例を示す。コンピュータ1において、図19に示すハードウェア群21(301〜312)の制御を行なうOS(オペレーティング・システム)22が動作する。OS22に従った手順でプロセッサ301が動作して、ハードウェア群21の制御・管理が行なわれることにより、アプリケーションプログラム24やミドルウェア23に従った処理がハードウェア群21で実行される。さらに、コンピュータ1において、ミドルウェア23またはアプリケーションプログラム24が、RAM302に読み出されてプロセッサ301により実行される。
プロセッサ301が、圧縮機能が呼び出された場合に、ミドルウェア23またはアプリケーションプログラム24の少なくとも一部に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア群21を制御して)圧縮部11の機能が実現される。また、プロセッサ301が、伸張機能が呼び出された場合に、ミドルウェア23またはアプリケーションプログラム24の少なくとも一部に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア群21を制御して)伸張部12の機能が実現される。圧縮機能および伸張機能は、それぞれアプリケーションプログラム24自体に含まれてもよいし、アプリケーションプログラム24に従って呼び出されることで実行されるミドルウェア23の一部であってもよい。もしくは圧縮機能および伸張機能がOS22の一機能であってもよい。
アプリケーションプログラム24(またはミドルウェア23)の圧縮機能では、処理対象のデータに合致するデータを抽出するための照合回数が抑制されるため、プロセッサ301のメモリアクセスの負荷が抑制される。そのため、RAM302上にワークエリアを確保する時間も削減される。
図21は、実施形態のシステムにおける装置の構成例を示す。図21のシステムは、コンピュータ1a、コンピュータ1b、基地局2およびネットワーク3を含む。コンピュータ1aは、無線または有線の少なくとも一方により、コンピュータ1bと接続されたネットワーク3に接続している。
図8に示す圧縮部11と伸張部12とは、図21に示すコンピュータ1aとコンピュータ1bとのいずれに含まれてもよい。例えば、コンピュータ1bが圧縮部11(制御部111、照合部112、更新部113および変換部114を含む)を含み、コンピュータ1aが伸張部12(制御部121、参照部122、更新部123および変換部124を含む)を含んでもよいし、コンピュータ1bが圧縮部11を含み、コンピュータ1aが伸張部12を含んでもよい。また、コンピュータ1aとコンピュータ1bとの双方が、圧縮部11および伸張部12を備えてもよい。
文字コードにおける位置が異なるデータ間の照合が発生する例について、図22および図23に基づいて補足説明する。
UTF−8のコード割り当てでは、2バイト以上の文字コードにおいて、2バイト目以降のバイトでは、値の範囲が共通している(いずれも0x80〜0xBFの範囲内である)。そのため、複数バイトで文字を表現する文字コードを用いたデータ同士で、バイト単位で照合を行なうと、異なる文字コードであっても一部分だけ一致することがあり得る。例えば、ある4バイト文字コードの3番目のバイトと、他の3バイト文字の2番目のバイトとが一致するなどの自体が発生する。すると、図22および図23に例示されるような照合処理が発生しうる。
図22は、圧縮対象のデータを構成するデータ単位と異なるデータ単位での照合処理例を示す。図22は、記憶領域A1及び記憶領域A2のそれぞれを部分的に示す。各記憶領域内の点線での区切りは1バイト単位での区切りを示し、実線での区切りは文字コードの区切りを示す。図22の例においては、各記憶領域内のデータとして3バイトの文字コードが例示されている。
例えば、図22に示すように、処理対象のデータを読み出す記憶領域A1内の位置が読出し位置P3(1)であるとし、処理対象のデータと照合される記憶領域A2内のデータの位置が参照位置P6(1)であるとする。図22に例示するように、3バイトの文字コード間の照合を1バイト単位で行なうと、最長一致データの終端が文字コードの区切りとは異なる位置に存在することがあり得る。図22には、3バイトの文字コードが2文字分と、3バイトの文字コード内の2バイト分が最長一致データとして抽出された場合が例示されている。LZ77を利用した圧縮処理においては、抽出された最長一致データの位置と長さに基づいて圧縮符号が生成されるので、参照位置P6(1)と最長一致データの長さ(8バイト)とに基づいて圧縮符号が生成される。
図22に示す最長一致データに基づいて圧縮符号が生成されると、処理対象を読み出す記憶領域A1内の位置が、読出し位置P3(1)から読出し位置P3(2)に更新される。続いて、読出し位置P3(2)からのデータに基づいて、最長一致データの探索が行なわれる。
図23は、圧縮対象のデータを構成するデータ単位と異なるデータ単位での照合処理例を示す。図23は、記憶領域A1及び記憶領域A2のそれぞれを部分的に示す。読出し位置P3(2)のデータは、「10XXXXXX」であり、UTF−8の文字コード系においては、2バイト目以降のデータである。例えば、読出し位置P3(2)のデータ(「10XXXXXX」)と合致する記憶領域A2内のデータが、図23に示すように、参照位置P6(21)や参照位置P6(22)に存在したとする。図23の例においては、参照位置P6(21)のデータは、3バイトの文字コードの3バイト目のデータであり、参照位置P6(22)のデータは、3バイトの文字コードの2バイト目のデータである。
読出し位置P3(2)のデータと参照位置P6(21)のデータとの一致に応じて、読出し位置P3(2)のデータに後続するデータ(図23の例では「1110YYYY」)と、参照位置P6(21)のデータに後続するデータ(図23の例では「1110YYYY」)との照合が行なわれる。この照合では、両方のデータが3バイトの文字コードの1バイト目であるため、照合により一致する可能性がある。
読出し位置P3(2)のデータと参照位置P6(22)のデータとの一致に応じて、読出し位置P3(2)のデータに後続するデータ(図23の例では「1110YYYY」)と、参照位置P6(22)のデータに後続するデータ(図23の例では「10XXXXXX」)との照合が行なわれる。この照合では、一方が3バイトの文字コードの1バイト目であり、他方が3バイトの文字コードの3バイト目であるため、照合により一致しないことが明らかである。
図22および図23に示される例においては、3バイトの文字コード間の照合を1バイト単位で行なうことにより、文字コードの区切りとは異なる位置で最長一致データが区切られる。すると、図23に示すように、文字コードにおける位置が異なるデータ間の照合が発生する可能性がある。しかしながら、例えば、3バイトの文字コードの1バイト目のデータと3バイト目のデータとは、文字コードの体系の都合上明らかに一致しないにも関わらず、照合処理が行なわれてしまう。
一方、上述の実施形態によれば、照合処理の単位が文字コード単位で行なわれるため、明らかに異なるデータ同士の照合処理が行なわれてしまうことが抑止される。
以下、上述の実施形態における変形例の一例を説明する。下記の変形例のみでなく、本発明の本旨を逸脱しない範囲の設計変更は適宜行なわれうる。
図24は、S301からS303の処理の例を示す。変換部114は、図12に示すS301〜S303の処理を、ファイルF1に用いられる文字コードが例えばUTF−8である場合に、以下の手順で実行する。
S300が行なわれる(S900)と、変換部114は、記憶領域A1の読出し位置P3から1バイトのデータを読み出す(S901)。変換部114は、読みだしたデータの1ビット目が「1」であるか否かを判定する(S902)。S901で読みだしたデータの1ビット目が「1」でない(「0」である)場合(S902:No)には、変換部114は、移動量Ldに1を代入する(S903)。移動量Ldは、後述の読出し位置P3の更新に用いられる。
S901で読みだしたデータの1ビット目が「1」である場合(S902:Yes)には、変換部114は、読みだしたデータの3ビット目が「1」であるか否かを判定する(S904)。S901で読みだしたデータの3ビット目が「1」でない(「0」である)場合(S904:No)には、変換部114は、移動量Ldに2を代入し、記憶領域A1からさらに1バイトのデータを読み出す(S905)。
S901で読みだしたデータの3ビット目が「1」である場合(S904:Yes)には、変換部114は、読みだしたデータの4ビット目が「1」であるか否かを判定する(S906)。S901で読みだしたデータの4ビット目が「1」でない(「0」である)場合(S906:No)には、変換部114は、移動量Ldに3を代入し、記憶領域A1からさらに2バイトのデータを読み出す(S907)。
S901で読みだしたデータの4ビット目が「1」である場合(S906:Yes)には、変換部114は、移動量Ldに4を代入し、記憶領域A1からさらに3バイトのデータを読み出す(S908)。
S903、S905、S907およびS908のいずれかが行なわれると、変換部114は、移動量Ldに基づいてインデックスE1を参照し、参照結果を利用して符号化辞書D1から、読みだしたデータに対応する固定長符号を読み出す(S909)。インデックスE1については、図25を用いて後述する。変換部114は、さらに、読出し位置P3を移動量Ldに示される量(Ldバイト)移動させる(S910)。S910の処理を終えると変換部114はS304の処理を実行する。
図25は、符号化辞書D1のインデックス例を示す。図25に示すインデックスE1は、移動量Ldが1〜4の場合それぞれについて、符号化辞書D1内のサーチ開始位置を示す。例えば、移動量Ldが1の場合には、変換部114は、固定長符号0x000の位置から符号化辞書D1のサーチを開始する。移動量Ldが2の場合には、変換部114は、固定長符号0x100の位置から符号化辞書D1のサーチを開始する。移動量Ldが3の場合には、変換部114は、固定長符号0x180の位置から符号化辞書D1のサーチを開始する。移動量Ldが4の場合には、変換部114は、固定長符号0x800の位置から符号化辞書D1のサーチを開始する。符号化辞書D1に含まれる文字コードの長さの分布に応じてインデックスE1の値が設定されることで、異なる長さの文字コード同士の照合が抑制される。符号化辞書D2に対して図25に示すインデックスと同様なインデックスを利用したサーチが行なわれてもよい。
図26は、最長一致固定長符号列の探索処理の変形例を示す。図26の変形例においては、記憶領域A2内の各固定長符号に対応したビットを含むビット列R1〜R3が用いられる。ビット列R1〜R3の記憶領域は、記憶部13内に設けられる。記憶領域A2内の各固定長符号に対して1ビット用いられるため、各ビット列のサイズは、記憶領域A2の1/mである。
ビット列R1は、照合対象の固定長符号M(j)が記憶領域A2内に含まれているか否かを示すビット列である。固定長符号M(j)とは、前述の通り、記憶領域A4内のj番目に格納された固定長符号である。すなわち、記憶領域A2内の位置Pxに固定長符号M(j)と同じ固定長符号が格納されている場合には、ビット列R1のPx番目のビットが「存在」を示す(値が「1」となる)。
ビット列R2は、固定長符号M(0)〜M(j−1)までの照合結果を示すビット列である。また、ビット列R3は、ビット列R1とビット列R2との演算結果をしめす。具体的には、ビット列R1をjビットスライド(図26中の矢印の方向)させて、スライドしたビット列R1とビット列R2とのAND演算の結果がビット列R3となる。AND演算が行なわれた後、j+1番目の処理のために、ビット列R3は、ビット列R2にコピーされる。具体的な手順は図27を用いて説明するが、ビット列R1〜R3を用いた上述の処理の繰り返すことで、「存在」を示すビットが最後まで残った位置により最長一致位置Paが示される。さらに、繰り返し回数が一致長Laを示す。
図27は、最長一致符号列の探索処理の手順例を示す。最長一致符号列の探索処理が開始される(S1000)と、制御部111は、ビット列R1〜R3を初期化する(S1001)。さらに、制御部111は、一致長Laおよび最長一致位置Paに初期値(La=0,Pa=P4−1など)をセットする(S1002)。さらに、制御部111は、カウンタ値jの初期値(j=0)をセットする(S1003)。
続いて、制御部111は、記憶領域A4に固定長符号M(j)が格納されているか否かを判断する(S1004)。記憶領域A4に固定長符号M(j)が格納されていない場合(S1004:No)には、制御部111は、固定長符号M(j)の取得処理を変換部114に実行させる(S1005)。変換部114は、図12に記載の処理を実行する。
記憶領域A4に固定長符号M(j)が格納されている場合(S1004:Yes)か、S1005の処理が実行された場合には、制御部111は、記憶領域A2内における固定長符号M(j)の存否結果をビット列R1に反映させる(S1006)。例えば、制御部111は、記憶領域A2中の固定長符号M(j)と同じ固定長符号の存在位置に対応するビットを「1」に変更する。さらに、制御部111は、ビット列R1をjビットスライドさせた(S1007)後、ビット列R2とビット列R1とで、ビット列内の各ビットのついてのAND演算を行ない、その結果をビット列R3とする(S1008)。
続いて、制御部111は、ビット列R3内に存在(「1」)を示すビットが存在するか否かを判定する(S1009)。ビット列R3内に存在(「1」)を示すビットが存在する場合(S1009:Yes)には、制御部111は、ビット列R1をビット列R2にコピーし(S1010)、カウンタ値jをインクリメントし(S1011)、S1004の処理を実行する。
ビット列R3内に存在(「1」)を示すビットが存在しない場合(S1009:No)には、制御部111は、ビット列R2内の存在(「1」)を示すビットのうち、いずれかの位置(何ビット目かを示す値)を最長一致位置Pa(固定長符号が何個分かを示す値)に代入する(S1012)。さらに、制御部111は、カウンタ値jを代入する(S1013)。S1013の処理が行なわれると、制御部111は、最長一致符号列の探索処理を終了する(S1014)。
さらに、文字コード長と照合処理の単位との不一致による不要な照合処理が発生することを抑制する実施形態の変形例を説明する。例えば、UTF−8においては、文字コードにおける始めの1バイトのデータにより文字コード長が判別される。例えば、図10のS104の処理で、照合部112が、記憶領域A1の読出し位置P3と記憶領域A2の参照位置P6との双方における1バイトのデータに基づいて文字コード長の合致判定を行ない、合致すると判定された場合に文字コード単位での照合を行なってもよい。文字コード内の始めの1バイトにより文字コード長が判別されるため、照合部112は、合致すると判定されてから、記憶領域A1の読出し位置P3と記憶領域A2の参照位置P6との双方における文字コードを読出し、文字コード単位での照合を行なう。
記憶領域A1の読出し位置P3の文字コードと、記憶領域A2の参照位置P6の文字コードとの双方で、文字コード長が合わない場合には、照合処理をスキップして参照位置P6の更新が行なわれる。参照位置P6の更新における参照位置P6の移動量は、例えば参照位置P6の文字コードの文字コード長である。
また、この変形例の前提として、記憶領域A2には、文字コードが格納される。すなわち、図12のS304の処理において文字コードが記憶領域A4に書き込まれ、さらに、図14のS502において記憶領域A4内の文字コードが記憶領域A2に書き込まれる。さらに、例えば、読出し位置P3の移動量Ldには、判別された文字コードのバイト数が用いられる。
上述の通り、記憶領域A1の読出し位置P3から読み出した文字コードと記憶領域A2の参照位置P6から読みだした文字コードのバイト数が合わない場合に文字コード同士の照合をスキップすることで、不要な文字コード同士の照合が回避される。この変形例を用いる場合には、上述の通り、図10のS106の処理では、記憶領域A1から読み出された文字コードが記憶領域A2に格納される。図17のS708においては、固定長符号ではなく、伸張データが記憶領域B2に書き込まれる。また、S706の処理がスキップされる。
さらに、他の変形例として、照合部112が、照合処理の実行単位は例えば1バイトで行ない、1バイトデータの照合の前に、1バイト文字コード内の位置が同一のデータであるかの判定を行なうこととしてもよい。文字コードによっては、文字コードの表現に用いられる各バイトのデータは、文字コード長および文字コード内での位置に応じて複数種類に分類される。例えば、図3に示す通り、UTF−8においては、1バイト文字は「0XXXXXXX」、2バイト文字の1バイト目は「110YYYYX」、3バイト文字の1バイト目は「1110YYYY」、4バイト文字の1バイト目は「11110YYY」、2〜4バイト文字の2バイト目以降は「10XXXXXX」である。「X」は不特定のビットを便宜的に表す。すなわち、UTF−8では、1バイトのデータにおける先頭から数ビットのデータに応じて5種類に分類される。種類が異なる1バイトデータ間で照合処理を行なったとしても合致しないことは明らかなので、例えば、照合部112は、1バイトデータ間で種類が異なれば照合処理をスキップする。これにより不要な照合処理が抑制される。また、各文字コードの先頭バイトの種類が一致しているので、結果的に文字コード長が合致したデータ間の照合処理により、最長一致データ列が抽出される。この変形例も記憶領域A2内に文字コードが格納されることを前提としている。そのため、記憶領域A2の更新処理について、先に説明した変形例と同様の制御が行なわれる。
また、圧縮処理の対象は、ファイル内のデータ以外にも、システムから出力される監視メッセージなどでもよい。例えば、バッファに順次格納される監視メッセージを上述の圧縮処理により圧縮し、ログファイルとして格納するなどの処理が行なわれる。また、例えば、データベース内のページ単位に圧縮が行なわれてもよいし、複数のページをまとめた単位で圧縮が行なわれてもよい。
また、上述の圧縮処理の対象となるデータは、上述の通り、文字情報に限定されるものでない。数値のみの情報であってもよいし、画像・音声などのデータに対して上述の圧縮処理を用いてもよい。例えば、音声合成により得られるデータを多量に含むファイルなどは、データ内に繰り返しを多く含むため動的辞書により圧縮率が向上することが見込まれる。また、固定カメラにより撮影された動画像についても各フレームの画像が似たものになることから繰り返しが多く含まれる。そのため、上述の圧縮処理を適用することにより、文書データや音声データと同様の効果を得ることができる。
図8は、機能構成例を示す。本実施形態の処理を実行するコンピュータ1は、記憶部13を含み、さらに、圧縮部11と伸張部12との少なくとも一方を含む。圧縮部11は圧縮処理を行ない、伸張部12は伸張処理を行なう。記憶部13は、圧縮対象のファイルF1や、圧縮処理により得られる圧縮ファイルF2や、ファイルF2を伸張して得られるファイルF3などを格納する。例えば、記憶部13は、符号化辞書D1を記憶する。また、記憶部13は、圧縮部11や伸張部12のワークエリアとして用いられる。圧縮部11は、制御部111、照合部112、更新部113および変換部114を含む。伸張部12は、制御部121、参照部122、更新部123および変換部124を含む。
図12は、固定長符号の取得処理の手順例を示す。変換部114は、制御部111に固定長符号M(j)の取得処理を指示される(S300)と、記憶領域A1の読出し位置P3に存在する文字コードを読み出す(S301)。1バイト文字なら1バイトのデータが読み出され、2バイト文字なら2バイトのデータが読み出される。次に、変換部114は、S301で読みだした文字コードに基づき、S301で読みだした文字コードに対応する固定長符号を符号化辞書D1から読み出す(S302)。さらに、変換部114は、位置情報テーブルに格納された読出し位置P3を示す情報を更新する(S303)。S303の更新は、S301で変換部114が読み出したデータの長さに基づいて行なわれる。例えば、1バイト文字が読み出されれば、読出し位置P3は1バイト移動される。制御部111は、S302で読みだした固定長符号を記憶領域A4のj番目の位置に格納する(S304)。上述の通り、記憶領域A4のj番目の位置に格納される固定長符号は、固定長符号M(j)である。変換部114は、固定長符号M(j)を記憶領域に格納すると、固定長符号の取得処理を終了する(S305)。
S205の判定で固定長符号同士が合致しない場合(S205:No)には、制御部111は、カウンタ値jが一致長Laよりも大きいか否かを判定する(S209)。カウンタ値jが一致長Laよりも大きい場合(S209:Yes)には、制御部111は、一致長Laにカウンタ値jを代入し、最長一致位置Paに参照位置P6を代入する(S210)。図11のS210の処理に示す「=」は代入演算子を示す。カウンタ値jが一致長La以下であるか(S209:No)、S210の処理が行なわれると、制御部111は、記憶領域A2内の参照位置P6の値をインクリメントする(S211)。具体的には、記憶領域A2に格納される固定長符号の符号長を単位としてインクリメントされ、固定長符号の符号長がmビットであれば参照位置P6はmビット移動される。次に、制御部111は、参照位置P6が記憶領域A2の終点位置P5に達したか否かを判断する(S212)。S212の判定において、参照位置P6が終点位置P5に達していない場合(S212:No)には、制御部111は、S202の処理を行なう。
制御部111は、S208の処理が行なわれるか、参照位置P6が終点位置P5に達している場合(S212:Yes)には、最長一致固定長符号列の探索処理を終了する(S213)。S104の探索処理の結果得られる最長一致固定長符号列は、S104の処理が終了した時点における記憶領域A2内の最長一致位置Paから一致長Laの範囲内の固定長符号列である。一致長Laは一致した符号の数を示すので、固定長符号の符号長がmビットであれば、最長一致固定長符号列はLa×mビットの長さとなる。
図8に示す圧縮部11と伸張部12とは、図21に示すコンピュータ1aとコンピュータ1bとのいずれに含まれてもよい。例えば、コンピュータ1bが圧縮部11(制御部111、照合部112、更新部113および変換部114を含む)を含み、コンピュータ1aが伸張部12(制御部121、参照部122、更新部123および変換部124を含む)を含んでもよいし、コンピュータ1aが圧縮部11を含み、コンピュータ1bが伸張部12を含んでもよい。また、コンピュータ1aとコンピュータ1bとの双方が、圧縮部11および伸張部12を備えてもよい。
UTF−8のコード割り当てでは、2バイト以上の文字コードにおいて、2バイト目以降のバイトでは、値の範囲が共通している(いずれも0x80〜0xBFの範囲内である)。そのため、複数バイトで文字を表現する文字コードを用いたデータ同士で、バイト単位で照合を行なうと、異なる文字コードであっても一部分だけ一致することがあり得る。例えば、ある4バイト文字コードの3番目のバイトと、他の3バイト文字の2番目のバイトとが一致するなどの事態が発生する。すると、図22および図23に例示されるような照合処理が発生しうる。
記憶領域A4に固定長符号M(j)が格納されている場合(S1004:Yes)か、S1005の処理が実行された場合には、制御部111は、記憶領域A2内における固定長符号M(j)の存否結果をビット列R1に反映させる(S1006)。例えば、制御部111は、記憶領域A2中の固定長符号M(j)と同じ固定長符号の存在位置に対応するビットを「1」に変更する。さらに、制御部111は、ビット列R1をjビットスライドさせた(S1007)後、ビット列R2とビット列R1とで、ビット列内の各ビットについてのAND演算を行ない、その結果をビット列R3とする(S1008)。
ビット列R3内に存在(「1」)を示すビットが存在しない場合(S1009:No)には、制御部111は、ビット列R2内の存在(「1」)を示すビットのうち、いずれかの位置(何ビット目かを示す値)を最長一致位置Pa(固定長符号が何個分かを示す値)に代入する(S1012)。さらに、制御部111は、一致長Laにカウンタ値jを代入する(S1013)。S1013の処理が行なわれると、制御部111は、最長一致符号列の探索処理を終了する(S1014)。