(57)【特許請求の範囲】
【請求項１】
入力される平文データを、夫々が所定の平文ブロック長を有する複数の平文ブロックに分割する分割部と、
前記複数の平文ブロックの夫々の平文ブロックに対し、スライド辞書型圧縮アルゴリズムを用いて前記平文ブロックを圧縮することによりペイロードを生成し、前記ペイロードの長さを示すヘッダを生成し、前記ヘッダおよび前記ペイロードを含む圧縮ブロックを生成する圧縮部と、
前記複数の平文ブロックから生成された複数の圧縮ブロックを連結することにより圧縮データを生成する連結部と、
を備え、
前記平文ブロック長は、前記圧縮データを伸張する論理回路により伸張されたデータの出力スループットを、前記論理回路の駆動クロックの周波数で除した値である、
データ圧縮装置。
【請求項２】
入力される平文データを、夫々が所定の平文ブロック長を有する複数の平文ブロックに分割する分割部と、
前記複数の平文ブロックの夫々の平文ブロックに対し、スライド辞書型圧縮アルゴリズムを用いて前記平文ブロックを圧縮することによりペイロードを生成し、前記ペイロードの長さを示すヘッダを生成し、前記ヘッダおよび前記ペイロードを含む圧縮ブロックを生成する圧縮部と、
前記複数の平文ブロックから生成された複数の圧縮ブロックを連結することにより圧縮データを生成する連結部と、
を備え、
前記圧縮部は、前記平文ブロック内の第１データが前記平文データ内の過去の第２データに一致している場合、前記第１データから第２データへの距離を示すコピー距離と前記第１データの長さであるコピー長さとを示すコピー記号を用いて、前記第１データを前記コピー記号に変換し、前記コピー記号を示す符号語を前記ペイロードに含め、
前記複数の平文ブロックから生成された複数のペイロードの中の連続するＭ個のペイロードの夫々が同一の第１コピー記号を示し、且つ前記第１コピー記号のコピー長さが前記平文ブロック長である場合、前記圧縮部は、前記Ｍ個のペイロードを一つの第２コピー記号に変換し、前記第２コピー記号のコピー長さとして前記平文ブロック長のＭ倍を指定する、
データ圧縮装置。
【請求項３】
平文データが複数の平文ブロックに分割され、前記複数の平文ブロックの夫々が所定の平文ブロック長を有し、前記複数の平文ブロックの夫々の平文ブロックに対し、スライド辞書型圧縮アルゴリズムを用いて前記平文ブロックを圧縮することによりペイロードが生成され、前記ペイロードの長さを示すヘッダが生成され、前記ヘッダおよび前記ペイロードを含む圧縮ブロックが生成され、前記複数の平文ブロックに対して生成された複数の圧縮ブロックを連結することにより生成された圧縮データを用い、前記圧縮データから前記複数の圧縮ブロックの夫々のヘッダを認識し、前記認識されたヘッダに示されている前記ペイロード長に基づいて前記圧縮データからペイロードを抽出する抽出部と、
前記スライド辞書型圧縮アルゴリズムを用いて前記抽出されたペイロードを伸張することにより前記平文ブロックを復元する伸張部と、
を備え、
前記平文ブロック長は、前記伸張部により復元される平文ブロックの出力スループットを、前記伸張部の駆動クロックの周波数で除した値である、
データ伸張装置。
【請求項４】
前記伸張部は、前記抽出されたペイロード内の符号語がリテラル文字を示す場合に前記符号語をリテラル文字に変換し、前記符号語がリテラル文字以外を示す場合に未確定であることを示す文字である未確定文字に変換することにより、前記抽出されたペイロードから、前記平文ブロック長を有する中間ブロックを生成する、
請求項３に記載のデータ伸張装置。
【請求項５】
前記伸張部は、前記未確定文字をスライド辞書内のリテラル文字に変換することにより、前記中間ブロックから平文ブロックを生成し、前記生成された平文ブロックを前記スライド辞書に格納する、
請求項４に記載のデータ伸張装置。
【請求項６】
前記伸張部は、前記抽出されたペイロードを伸張するパイプラインを含む、
請求項５に記載のデータ伸張装置。
【請求項７】
前記伸張部は、前記駆動クロックのサイクル毎に、一つの平文ブロックを復元する、
請求項６に記載のデータ伸張装置。
【請求項８】
平文データが複数の平文ブロックに分割され、前記複数の平文ブロックの夫々が所定の平文ブロック長を有し、前記複数の平文ブロックの夫々の平文ブロックに対し、スライド辞書型圧縮アルゴリズムを用いて前記平文ブロックを圧縮することによりペイロードが生成され、前記ペイロードの長さを示すヘッダが生成され、前記ヘッダおよび前記ペイロードを含む圧縮ブロックが生成され、前記複数の平文ブロックに対して生成された複数の圧縮ブロックを連結することにより生成された圧縮データを用い、前記圧縮データから前記複数の圧縮ブロックの夫々のヘッダを認識し、前記認識されたヘッダに示されている前記ペイロード長に基づいて前記圧縮データからペイロードを抽出する抽出部と、
前記スライド辞書型圧縮アルゴリズムを用いて前記抽出されたペイロードを伸張することにより前記平文ブロックを復元する伸張部と、
を備え、
前記平文ブロック内の第１データが前記平文データ内の過去の第２データに一致している場合、前記第１データから第２データへの距離を示すコピー距離と前記第１データの長さであるコピー長さとを示すコピー記号を用いて、前記第１データが前記コピー記号に変換され、前記コピー記号を示す符号語が前記ペイロードに含められ、
前記抽出されたペイロードが第３コピー記号を示し、且つ前記第３コピー記号のコピー長さが前記平文ブロック長のＭ倍を示す場合、前記抽出部は、前記抽出されたペイロードを連続するＭ個の第４コピー記号に変換し、前記第４コピー記号のコピー長さとして前記平文ブロック長を指定する、
データ伸張装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ圧縮およびデータ伸張の技術に関する。
【背景技術】
【０００２】
ＬＺ７７は、１９７７年にレンペル（Ｌｅｍｐｅｌ）及びジフ（Ｚｉｖ）によって開発された、最も一般的な可逆データ圧縮アルゴリズムである。ＬＺ７７の原理はスライド辞書型圧縮である。ＬＺ７７は、文字列ストリームの先頭から末尾に向かってポインタを移動させながら、現在のポインタより過去の所定長さの文字列ストリーム（スライド辞書と呼ぶ）において、現在のポインタから始まる文字列に最も長く一致するものを探す。更にＬＺ７７は、現在のポインタが示す文字列を、コピー記号に変換することで文字列ストリームのデータ量を減らし、文字列ストリームを圧縮する。ＬＺ７７は、原理が簡単で実装しやすい上に比較的圧縮率が良いことで知られる。なお、スライド辞書の大きさは任意であり、大きくするほど文字列の一致確率は増すので圧縮率は向上する。【０００３】
大量のデータを蓄積・管理するためのストレージシステムに、より多くのデータを格納すれば容量当たりのコストを低減することができるため、データ圧縮機能を搭載しているものがある。ストレージシステムは、ファイル単位でデータを管理するファイルストレージ、固定サイズのセクタ単位でデータを管理するブロックストレージの２種類に分類される。どちらのストレージシステムでもデータ圧縮機能に採用されている圧縮方式としては、前述のＬＺ７７、またはＬＺ７７から派生したアルゴリズムがほとんどである。【０００４】
特許文献１には、ＬＺ７７に基づく圧縮データの伸張を高速化する技術が開示されている。また、特許文献１には、汎用プロセッサを用いたソフトウェア処理によって、圧縮データを高速に伸張するための並列化技法が開示されている。この技術は、圧縮すべき平文データを複数ブロックに分割し、それぞれを圧縮する。ブロックの数は、伸張の際に使用するプロセッサの並列処理能力（コア数など）に基づいて決定される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−０６８５１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
平文データを同一サイズの複数のブロックに分割して夫々のブロックを圧縮し、ソフトウェアによる伸張を行う場合、各ブロックの伸張に要する時間はデータ内容に依存して変化する。この課題に対し、特許文献１には、各ブロックのサイズを可変にし、試験的な圧縮・伸張を繰り返すことにより分割境界を調整し、伸張時間を平準化する方法が開示されている。【０００７】
ストレージシステムや通信システムなどにおいて、データを出力するスループットを保証する場合がある。このようなシステムが圧縮データを伸張して出力する場合、ソフトウェアによる伸張では、スループットを保証できない場合がある。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、本発明の一態様であるデータ圧縮装置は、入力される平文データを、夫々が所定の平文ブロック長を有する複数の平文ブロックに分割する分割部と、複数の平文ブロックの夫々の平文ブロックに対し、スライド辞書型圧縮アルゴリズムを用いて平文ブロックを圧縮することによりペイロードを生成し、ペイロードの長さを示すヘッダを生成し、ヘッダおよびペイロードを含む圧縮ブロックを生成する圧縮部と、複数の平文ブロックから生成された複数の圧縮ブロックを連結することにより圧縮データを生成する連結部と、を備える。【０００９】
本発明の別の一態様であるデータ伸張装置は、平文データが複数の平文ブロックに分割され、複数の平文ブロックの夫々が所定の平文ブロック長を有し、複数の平文ブロックの夫々の平文ブロックに対し、スライド辞書型圧縮アルゴリズムを用いて平文ブロックを圧縮することによりペイロードが生成され、ペイロードの長さを示すヘッダが生成され、ヘッダおよびペイロードを含む圧縮ブロックが生成され、複数の平文ブロックに対して生成された複数の圧縮ブロックを連結することにより生成された圧縮データを用い、圧縮データから複数の圧縮ブロックの夫々のヘッダを認識し、認識されたヘッダに示されているペイロード長に基づいて圧縮データからペイロードを抽出する抽出部と、スライド辞書型圧縮アルゴリズムを用いて抽出されたペイロードを伸張することにより平文ブロックを復元する伸張部と、を備える。
【発明の効果】
【００１０】
本発明の一態様によれば、圧縮データを伸張するスループットを保証することができる。
【図面の簡単な説明】
【００１１】
【図１】本発明の実施例のフラッシュメモリストレージ１０１の構成を示す。
【図２】Ｄｅｆｌａｔｅアルゴリズムによるデータ圧縮の一例を示す。
【図３】Ｄｅｆｌａｔｅアルゴリズムによるデータ伸張の一例を示す。
【図４】実施例１の圧縮伸張回路１０４の構成を示す。
【図５】実施例１のデータ圧縮処理を示す。
【図６】実施例１のデータ圧縮処理の具体例を示す。
【図７】実施例１のデータ伸張処理を示す。
【図８】ペイロード抽出部６２１の動作の具体例を示す。
【図９】符号展開部６２２の構成および動作の具体例を示す。
【図１０】文字解決部６２３の構成および動作の具体例を示す。
【図１１】実施例２の圧縮伸張回路１０４の構成を示す。
【図１２】二次的圧縮の具体例を示す。
【発明を実施するための形態】
【００１２】
本発明の実施例について図面を用いて説明する。
【実施例１】
【００１３】
以下、本発明の実施例として、フラッシュメモリを記憶媒体に利用したストレージ装置について説明する。【００１４】
近年、ストレージシステムの記憶媒体として、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）に加えて又は代えて、不揮発性半導体メモリであるＮＡＮＤ型フラッシュメモリを多量に搭載したＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）などのフラッシュメモリストレージが注目されている。【００１５】
フラッシュメモリはＨＤＤのようなヘッドシーク機構を持たないため、データアクセスにおいて頭出し遅延（レイテンシ）が少ない。したがって、フラッシュメモリは、ランダムなデータリードにおいて優れた速度性能を有する。そのため、高速なランダムリードが求められるデータベース等のアプリケーションでは、ストレージシステムの記憶媒体としてＨＤＤからフラッシュメモリストレージへの置き換えが進んでいる。ただし、フラッシュメモリストレージのビットコストは、半導体プロセスの微細化によるフラッシュメモリセルの高集積化に伴って年々安くなってきているが、依然ＨＤＤのビットコストに比べて３倍から１０倍程度と高いままである。ストレージシステムの導入コストを重視するユーザにとって、フラッシュメモリストレージのビットコストは、フラッシュメモリストレージの採用をためらう要因となっている。【００１６】
そこで、フラッシュメモリストレージにデータ圧縮技術を導入することにより、フラッシュメモリへ格納される物理的なデータサイズを減らすことができる。そうすれば、フラッシュメモリストレージの記憶容量を仮想的に大きく見せることができ、そのビットコストを低下させることができる。【００１７】
図１は、本発明の実施例の計算機システムの構成を示す。この計算機システムは、上位コントローラ１１０と、複数のフラッシュメモリストレージ１０１とを有する。上位コントローラ１１０は、フラッシュメモリストレージ１０１に接続され、フラッシュメモリストレージ１０１を制御する。計算機システムは、一つのフラッシュメモリストレージ１０１を有していても良い。フラッシュメモリストレージ１０１は、上位Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）１０２、フラッシュメモリコントローラ１０３、複数のフラッシュメモリ１０５、揮発性のメモリであるＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０６を有する。フラッシュメモリ１０５は、ＮＡＮＤ型フラッシュメモリを有するチップである。【００１８】
フラッシュメモリコントローラ１０３は、圧縮伸張回路１０４とマイクロプロセッサ（ＭＰ）１０７とを含む。マイクロプロセッサ１０７は更に、上位Ｉ／Ｆ１０２、フラッシュメモリ１０５、ＤＲＡＭ１０６と接続され、それらを制御する。マイクロプロセッサ１０７は、ＤＲＡＭ１０６に格納されたプログラムに従って、上位コントローラ１１０からのリード／ライトコマンドの内容解釈、上位コントローラ１１０との間のデータ送受信、圧縮伸張回路１０４によるデータの圧縮・伸張の制御、フラッシュメモリ１０５やＤＲＡＭ１０６との間のデータ転送などを実行する。なお、計算機システムは、ストレージシステムであっても良いし、サーバシステムであっても良い。ストレージシステムにおける上位コントローラ１１０は例えば、フラッシュメモリストレージ１０１を用いるＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙｓ  ｏｆ  Ｉｎｄｅｐｅｎｄｅｎｔ  Ｄｉｓｋｓ）などを制御するストレージコントローラである。ストレージコントローラは、ＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）等のネットワークを介してホスト計算機に接続され、ホスト計算機からのリード／ライトコマンドに応じてフラッシュメモリストレージ１０１を制御する。サーバシステムにおける上位コントローラ１１０は例えば、フラッシュメモリストレージ１０１に対してリード／ライトを行うサーバ計算機である。【００１９】
上位Ｉ／Ｆ１０２は上位コントローラ１１０と接続するためのインタフェース機構であり、データを上位コントローラ１１０に送信したり、データを上位コントローラ１１０から受信したりするために、リード／ライトコマンドに応答する。上位Ｉ／Ｆ１０２の機構およびコマンドや、データの送受信のプロトコルは、例えばＨＤＤと互換性のあるインタフェース仕様に準拠する。【００２０】
圧縮伸張回路１０４は、データ圧縮およびデータ伸張を行う論理回路である。圧縮伸張回路１０４は、フラッシュメモリ１０５に格納するデータ量を削減するために、上位コントローラ１１０からのライトコマンドに応じて受信したライトデータを可逆的に圧縮し、圧縮データを生成する。更に圧縮伸張回路１０４は、上位コントローラ１１０からのリードコマンドに応じて平文データを上位コントローラ１１０に送信するために、フラッシュメモリ１０５から読み出した圧縮データを伸張して平文データを生成する。【００２１】
マイクロプロセッサ１０７は、上位コントローラ１１０からのライトデータを、まずＤＲＡＭ１０６に格納する。この時点でマイクロプロセッサ１０７は、上位コントローラ１１０に対してライト完了の応答を返す。その後、マイクロプロセッサ１０７は、圧縮伸張回路１０４にライトデータの圧縮を指示する。この指示に応じて、圧縮伸張回路１０４は、ライトデータを圧縮して圧縮データへ変換し、圧縮データをＤＲＡＭ１０６に格納する。そして、マイクロプロセッサ１０７は、圧縮データをフラッシュメモリ１０５にライトする。【００２２】
マイクロプロセッサ１０７は、上位コントローラ１１０からのリードコマンドに応じて、フラッシュメモリ１０５から圧縮データをリードし、ＤＲＡＭ１０６に格納する。その後、マイクロプロセッサ１０７は、圧縮伸張回路１０４に圧縮データの伸張を指示する。この指示に応じて、圧縮伸張回路１０４は、圧縮データを伸張して平文データへ変換し、平文データをＤＲＡＭ１０６に格納する。そして、マイクロプロセッサ１０７は、ＤＲＡＭ１０６に格納された平文データを上位コントローラ１１０に送信する。【００２３】
このように、データライトはライト完了を返した後に圧縮処理を実行するので、上位コントローラ１１０から見えるフラッシュメモリストレージ１０１のライト性能は圧縮するか否かにかかわらず一定である。一方、データリードは上位コントローラ１１０にリードデータを返し終わるまで完了しないため、上位コントローラ１１０から見えるフラッシュメモリストレージ１０１のリード性能は、圧縮データの伸張時間に依存する。つまり、圧縮伸張回路１０４が高速なリアルタイム伸張処理を行うことができれば、フラッシュメモリストレージ１０１のリード性能を向上させることができる。【００２４】
圧縮伸張回路１０４は、論理回路として実装される。圧縮伸張回路１０４は、高速なデータ伸張スループットを持つため、フラッシュメモリストレージ１０１の特徴である高速なランダムリード性能を、非圧縮データだけでなく圧縮データに対しても実現することができる。ストレージシステムにおいて、上位コントローラ１１０から圧縮データの読み出し要求がきた場合、圧縮データを伸張し、平文データを上位コントローラ１１０に返すスループットが、通常の非圧縮データの読み出しの場合と比べて著しく悪化しないように、圧縮データの伸張はできるだけ高速に行うことが好ましい。【００２５】
なお、本発明のユースケースは、フラッシュメモリストレージ１０１に限られない。本発明を他のストレージシステムのデータ圧縮機能にも適用できる。従来のストレージシステムにおいても圧縮機能を搭載したストレージを利用して容量コスト低減が図られていた。しかし、従来のストレージシステムでは、圧縮データのリード性能を保証することが難しいため、バックアップやスナップショットイメージなどリードアクセス頻度の低い静的なデータにデータ圧縮機能を利用する場合が多い。本発明を適用したストレージシステムによれば、圧縮データに対しても高速なリード性能を保証できるので、リードアクセス頻度の高い動的なデータに対してもデータ圧縮機能を利用できる。【００２６】
以下、ＬＺ７７に基づく一般的なスライド辞書型アルゴリズムによるデータ圧縮・伸張方法について説明する。【００２７】
ここでは、ＲＦＣ（Ｒｅｑｕｅｓｔ  ｆｏｒ  Ｃｏｍｍｅｎｔｓ）１９５１に規定され、最もよく知られているＤｅｆｌａｔｅアルゴリズムについて説明する。データ圧縮を行うデータ圧縮機能と、データ伸張を行うデータ伸張機能とは、ソフトウェアまたはハードウェアで実現される。【００２８】
図２は、Ｄｅｆｌａｔｅアルゴリズムによるデータ圧縮の一例を示す。【００２９】
Ｄｅｆｌａｔｅアルゴリズムによるデータ圧縮は、ＬＺ７７圧縮とビットパタンへの符号化とを含む。この図は、文字列として表された平文データ２００と、平文データ２００をＬＺ７７により圧縮した文字列であるＬＺ７７圧縮データ２１０と、ＬＺ７７圧縮データ２１０を符号化したビットパタンである圧縮データ２２０とを示す。符号化は、例えばハフマン符号化である。【００３０】
データ圧縮機能は、文字列ストリームである平文データ２００において、出現した文字列と同じ文字列が後に再び出現するかどうかを順番に調べていく。これにより、ある文字列が、その先頭文字のＪ文字前からＬ文字連続で一致している場合、データ圧縮機能は、この文字列をコピー記号［Ｌ，Ｊ］に変換する。Ｌをコピー長さ、Ｊをコピー距離と呼ぶことがある。例えば、「ｂ，ｃ，ｄ，ｅ」の４文字の文字列２０１は、先頭の文字「ｂ」の６文字前から４文字連続で一致している。この場合、データ圧縮機能は、文字列２０１を［４，６］のコピー記号２１１に変換する。同様に、「ａ，ｂ，ａ，ｂ」の４文字の文字列２０２は、先頭の文字「ａ」の２文字前から、互いに重なる部分も含めて４文字連続で一致している。この場合、データ圧縮機能は、文字列２０２を［４，２］のコピー記号２１２に変換する。同様に、「ｃ，ｄ，ｅ，ｆ」の４文字の文字列２０３は、先頭の文字「ｃ」の１４文字前から４文字連続で一致している。この場合、データ圧縮機能は、文字列２０３を［４，１４］のコピー記号２１３に変換する。【００３１】
これらのコピー記号２１１、２１２、２１３のデータ量は元の文字列２０１、２０２、２０３の持つデータ量よりも少ないので、この変換により平文データ２００のデータ量を減らしたＬＺ７７圧縮データ２１０を生成することができる。一方、データ圧縮機能は、平文データ２００の中で初めて出現した文字や、連続で一致する文字数が３文字に満たない文字列（つまりＬ＜３）については、元の文字列の持つデータ量が十分少ないため、このような変換を行わない。【００３２】
前述の一致検索で参照する文字列ストリーム（以下、辞書と呼ぶ）の範囲は、１文字前から所定の辞書サイズの文字数だけ過去（前方）までの範囲とする。これは、辞書サイズを制限しないとコピー記号［Ｌ，Ｊ］のＪ（戻り量）を表すデータ量が多くなり、データ量の削減効果が低下するからである。また、辞書サイズを制限しないと検索時間が増大して性能が落ちるからである。辞書の範囲が検索の度に後方へスライドしていくので、この辞書はスライド辞書とも呼ばれ、ＬＺ７７はスライド辞書型圧縮アルゴリズム（スライド辞書法）の一つである。【００３３】
なお、一致する文字列がスライド辞書内に複数存在する場合、データ圧縮機能は、連続で最も長く一致する文字列をコピー記号に変換する。これにより、データ量をより多く減らす効果がある。【００３４】
このようにＬＺ７７圧縮は、辞書サイズまでの過去の範囲の文字列をスライド辞書として用いることにより、データ量を減らす文字列変換である。【００３５】
ＬＺ７７圧縮を行っただけでは、まだ圧縮データを生成したことにはならない。コピー記号はあくまでコピーを行うという動作を表現した記号であり、圧縮データではない。データ圧縮機能は、圧縮データを生成するために、コピー記号に変換されなかった文字（以下、リテラル文字と呼ぶ）とコピー記号とを規定の符号化方法で符号化し、それらを連結してビットストリームにする。このビットストリームは、Ｄｅｆｌａｔｅの規則に従って符号化した結果であり、最終的に生成される圧縮データ２２０である。【００３６】
圧縮データ２２０の中で、ビットパタン２２１は１３ビット長でコピー記号［４，６］の符号語、ビットパタン２２２は１２ビット長でコピー記号［４，２］の符号語、ビットパタン２２３は１４ビット長でコピー記号［４，１４］の符号語である。圧縮データ２２０の中で、その他の８ビット長のビットパタンは、リテラル文字の符号語である。このように圧縮データ２２０の中の各符号語のビットパタン長は固定ではない。【００３７】
図３は、Ｄｅｆｌａｔｅアルゴリズムによるデータ伸張の一例を示す。【００３８】
データ伸張機能は、圧縮データ２２０のビットストリームを入力とし、データ圧縮機能の処理を逆にたどって元の平文データ２００を復元する。【００３９】
まず、データ伸張機能は、圧縮データ２２０をＬＺ７７圧縮データ２１０の記号表現に戻すため、複数のビットパタンを連結した圧縮データ２２０のビットストリームの中から個々のビットパタン（符号語）を抽出する必要がある。しかし、各符号語のビットパタン長は固定ではないため、ランダムな位置から即座にビットパタンを抽出することは困難である。データ伸張機能は、基本的に圧縮データ２２０のビットストリームの先頭から抽出ポインタを設定し、後方へ１つずつ順番にビットパタンを抽出する。【００４０】
例えば、データ伸張機能は、抽出ポインタを圧縮データ２２０の先頭の位置２４１に設定し、そこから始まる「１００１０００１」というビットパタンが文字「ａ」を表すことが分かれば、抽出ポインタの移動（２４２）を行い、抽出ポインタを位置２４３に設定する。そして、データ伸張機能は、そこから始まる「１００１００１０」というビットパタンが文字「ｂ」を表すことが分かれば、抽出ポインタの移動（２４４）を行い、抽出ポインタを位置２４５に設定する。このように、データ伸張機能は、１つ前のビットパタンを判別できてはじめて抽出ポインタの位置を確定する。一般的に、圧縮データ２２０をＬＺ７７圧縮データ２１０の記号表現に戻す復号処理は、このような効率の悪い直列処理である。【００４１】
ただし、この復号処理に並列処理を適用できないわけではない。データ伸張機能は、各符号語のビットパタン長のバリエーションは予め分かっているので、符号語の並び方の全てのケースを示す抽出ポイント候補２４７を列挙することができる。例えば、データ伸張機能は、抽出ポイント候補２４７の中に本当の抽出ポイントが１つ存在することを予め知ることができる。そこで、データ伸張機能は、先頭から符号語の抽出を進めるだけでなく、抽出ポイント候補２４７の中の各ポイントについても暫定的な抽出を同時に開始する。それまでの範囲２４６の抽出が終われば、候補２４７の中の正しい抽出ポイントは１つに定まる。定まった時点で、その抽出ポイントから先の抽出はすでに進んでいるため、処理性能は向上する。しかし、この手法をハードウェアで実現しようとすると、大量のビットパタンデコーダを配置する必要があるので非常に回路規模が大きくなる。したがって、この手法は、現実的には困難である。【００４２】
以下、本実施例の圧縮伸張回路１０４について説明する。【００４３】
本実施例の圧縮伸張回路１０４は、ハードウェア処理によるデータ伸張の回路規模コストの増加を抑え、高速化することができる。【００４４】
図４は、実施例１の圧縮伸張回路１０４の構成を示す。【００４５】
圧縮伸張回路１０４は、データ圧縮処理を行う圧縮回路６１０と、データ伸張処理を行う伸張回路６２０とを有する。【００４６】
圧縮回路６１０は、分割部６１１と、圧縮部６１７と、連結部６１６とを有する。分割部６１１には平文データが入力される。圧縮部６１７は、ペイロード生成部６１２と、ヘッダ生成部６１３とを有する。分割部６１１は、平文データを複数の平文ブロックに分割する。ペイロード生成部６１２は、スライド辞書型圧縮アルゴリズムを用いて平文ブロックを圧縮することにより圧縮ペイロードを生成する。ヘッダ生成部６１３は、圧縮ペイロードの長さを示すヘッダを生成し、圧縮ヘッダおよび圧縮ペイロードを含む圧縮ブロックを生成する。連結部６１６は、複数の圧縮ブロックを連結することにより、圧縮データを生成する。【００４７】
なお、圧縮ヘッダをヘッダと呼ぶことがある。また、圧縮ペイロードをペイロードと呼ぶことがある。【００４８】
伸張回路６２０は、抽出部６２７と、伸張部６２８とを有する。抽出部６２７は、ペイロード抽出部６２１を有する。伸張部６２８は、符号展開部６２２と、文字解決部６２３とを有する。ペイロード抽出部６２１には圧縮データが入力される。ペイロード抽出部６２１は、圧縮データ内の圧縮ヘッダを認識し、認識された圧縮ヘッダに示されているペイロード長に基づいて圧縮データから圧縮ペイロードを抽出する。符号展開部６２２は、圧縮ペイロードを、平文ブロックと同じ長さの中間ブロックに変換する。文字解決部６２３は、スライド辞書を用いて中間ブロック内の未解決の文字を解決することにより、平文ブロックを復元する。符号展開部６２２および文字解決部６２３は、圧縮ペイロードを平文ブロックに変換するためのパイプラインを有する。【００４９】
以下、本実施例のデータ圧縮処理について説明する。【００５０】
本実施例のデータ圧縮処理では、圧縮したい平文データを等しいサイズの複数の平文ブロックに分割する。その平文ブロック長をＮ［バイト］とする。Ｎの値は、伸張回路６２０が圧縮データを伸張して平文データを出力するスループットである出力スループット値と、伸張回路６２０の駆動クロック周波数を用いて決定される。出力スループット値は、上位Ｉ／Ｆ１０２が上位コントローラ１１０へリードデータを送信する伝送速度であっても良いし、その伝送速度より高くても良い。例えば、出力スループット値をＸ［ＭＢ／ｓ］、駆動クロック周波数をＦ［ＭＨｚ］とするとき、Ｎ＝Ｘ／Ｆと定める。なお、平文データ４００内の１バイトは１つの文字を意味する。つまり、分割された各平文ブロックは、Ｎ文字の文字列を含む。これにより、伸張回路６２０が圧縮データを伸張し、駆動クロックのサイクル毎にＮバイトの平文データを出力することにより、予め定められた出力スループットで平文データを出力することができる。【００５１】
図５は、実施例１のデータ圧縮処理を示す。【００５２】
まず、分割部６１１は、入力された平文データをＮ文字（バイト）単位で複数のブロックに分割する（３０１）。次に、ペイロード生成部６１２は、分割された各平文ブロックを前述のようなＬＺ７７圧縮によって圧縮し、ビットパタン符号化によってビットストリームを生成する（３０２）。このビットストリームを圧縮ペイロードと呼ぶ。【００５３】
なお、ステップ３０２においてペイロード生成部６１２は、各平文ブロックのＬＺ７７圧縮を次の２つの規則に従って行う。【００５４】
第１の規則は、スライド辞書の範囲は平文ブロック境界をまたいでもよいという規則である。すなわち、スライド辞書は、平文ブロック境界に関わらず、一般的なＬＺ７７圧縮と同じように、所定の辞書サイズを持ち、平文データの後方に向かってスライドする。【００５５】
第２の規則は、平文ブロック内の文字列とスライド辞書の間で一致検索を行っている間に、文字列が当該平文ブロックの終端に来たら検索を停止するという規則である。すなわち、平文ブロック境界をまたぐ文字列が１つのコピー記号に変換されないようにする。例えば、１０文字の文字列がＪ文字前にも存在していたが、当該文字列のうち前部の６文字と後部の４文字の間に平文ブロック境界がある場合、前部の６文字はコピー記号［６，Ｊ］に変換されて境界の前に含められ、後部の４文字はコピー記号［４，Ｊ］に変換されて境界の後に含められる。【００５６】
ステップ３０２に続いて、ヘッダ生成部６１３は、圧縮ペイロードの長さが何ビットであるかを計算し、その長さを示す圧縮ヘッダを生成し、各圧縮ペイロードの直前に当該圧縮ヘッダを付加して圧縮ブロックとする（３０３）。圧縮ヘッダは、例えば圧縮ペイロードのビット長そのものを表すビットパタン（７４ビットなら１００１０１０）である。しかし、圧縮ヘッダはそれに限定されるものではなく、圧縮ペイロードのビット長を特定できればどのようなデータでもよい。【００５７】
最後に、連結部６１６は、全ての圧縮ブロックを連結することにより圧縮データ４４０（ビットストリーム）を生成し（３０４）、このフローを終了する。【００５８】
図６は、実施例１のデータ圧縮処理の具体例を示す。【００５９】
例えば、フラッシュメモリストレージ１０１のリードデータの出力スループット値を１６００ＭＢ／ｓ、圧縮伸張回路１０４の駆動クロック周波数を２００ＭＨｚとする。前述の平文ブロック長の算出方法により、平文ブロック長Ｎは８となる。以下の説明においてはＮを８とする。分割部６１１は、平文データを８バイト単位に分割する。この具体例では、平文データ４００の先頭から４０バイトが平文ブロック４０１、４０２、４０３、４０４、４０５、…に分割される。次に、ペイロード生成部６１２は、各平文ブロックのデータをＬＺ７７圧縮する。【００６０】
平文ブロック４０１は、平文データ４００の先頭から圧縮対象までの範囲をスライド辞書として２４ビットの圧縮ペイロード４２１へ圧縮されている。平文ブロック４０２は、平文データ４００の先頭から圧縮対象までの範囲４１２をスライド辞書として４０ビットの圧縮ペイロード４２２へ圧縮されている。平文ブロック４０３は、平文データ４００の先頭から圧縮対象までの範囲４１３をスライド辞書として４８ビットの圧縮ペイロード４２３へ圧縮されている。平文ブロック４０４は、平文データ４００の先頭から圧縮対象までの範囲４１４をスライド辞書として１６ビットの圧縮ペイロード４２４へ圧縮されている。平文ブロック４０５は、平文データ４００の先頭から圧縮対象までの範囲４１５をスライド辞書として４０ビットの圧縮ペイロード４２５へ圧縮されている。以下、同様にして平文データの最終の平文ブロックまで圧縮される。この具体例では、各平文ブロックの辞書範囲が常に平文データ４００の先頭から始まっているが、後の平文ブロックにおいては、従来のＬＺ７７圧縮と同様に、スライド辞書に含まれる文字列のサイズが所定の辞書サイズに達したら、スライド辞書の範囲の先頭は平文データ４００の後方にスライドする。この後、スライド辞書に含まれる文字列は、圧縮対象より過去へ辞書サイズ分の文字列になる。【００６１】
圧縮ヘッダ４３１、４３２、４３３、４３４、４３５、…は、それぞれ圧縮ペイロード４２１、４２２、４２３、４２４、４２５、…のビット長を示すデータである。最終的な圧縮データ４４０は、圧縮ヘッダおよび圧縮ペイロードの組である圧縮ブロックが連結されたビットストリームである。【００６２】
このデータ圧縮処理によれば、平文データを同一サイズの複数の平文ブロックに分割し、ＬＺ７７圧縮を用いて平文ブロックを圧縮して圧縮ペイロードを生成し、圧縮ペイロードを示す圧縮ヘッダを付加することができる。これにより、データ伸張処理において、複数の圧縮ペイロードの長さが異なっていても、圧縮ヘッダに基づいて圧縮ペイロードを抽出することができると共に、次の圧縮ブロックを抽出することができる。【００６３】
以下、本実施例のデータ伸張処理について説明する。【００６４】
図７は、実施例１のデータ伸張処理を示す。【００６５】
ペイロード抽出部６２１は、バッファレジスタを有する。まず、ペイロード抽出部６２１は、入力される圧縮データをバッファレジスタで受け取り、分析するビットパタンの位置を示す分析ポインタを圧縮データのビットストリームの先頭（すなわち、最初の圧縮ヘッダの先頭）に設定する。【００６６】
ペイロード抽出部６２１は、分析ポインタから始まる圧縮ヘッダを分析し、圧縮ヘッダに基づいて、それに続く圧縮ペイロードの圧縮ペイロード長を特定し、その圧縮ペイロード長に基づいて当該圧縮ペイロードを抽出する（５０１）。【００６７】
ペイロード抽出部６２１は、抽出した圧縮ペイロードを、符号展開部６２２および文字解決部６２３のパイプラインへ送り出す（５０２）。【００６８】
ペイロード抽出部６２１は、抽出した圧縮ペイロードの終端が圧縮データの終端であるか否かを判定する（５０３）。抽出した圧縮ペイロードの終端が圧縮データの終端であるならば、ペイロード抽出部６２１は、ステップ５０５に遷移する。一方、圧縮データの終端ではないならば、ペイロード抽出部６２１は、分析ポインタを次の圧縮ヘッダに移動させる（５０４）。そして、ペイロード抽出部６２１は、処理を再びステップ５０１に遷移させる。【００６９】
ステップ５０５においてペイロード抽出部６２１は、符号展開部６２２および文字解決部６２３のパイプラインに送り出された最後の圧縮ペイロードが、パイプラインを通過し終えるまで待機する（５０５）。【００７０】
以上のようにして、元の平文データを構成していた最後の平文ブロックが復元され、文字解決部６２３から出力されれば、データ伸張処理は完了となる。【００７１】
ここで、ステップ５０１〜５０４の一連の処理は、圧縮データを構成する圧縮ブロックの数だけ繰り返される。ペイロード抽出部６２１はこの処理を駆動クロック１サイクルの時間で行う。論理回路設計に通じた当業者であれば、ペイロード抽出部６２１のハードウェアを容易に設計することができる。ペイロード抽出部６２１は、例えば、以下の構成を有する論理回路である。【００７２】
（１）外部から入力された圧縮データを格納するためのバッファレジスタ
（２）バッファレジスタの先頭部分に接続され、圧縮ヘッダを分析するビットパタンデコーダ
（３）ビットパタンデコーダのデコード結果に基づきペイロードを抽出し、前述のパイプラインに渡すためのデータローダ
（４）ビットパタンデコーダのデコード結果に基づき、次の圧縮ヘッダがバッファレジスタの先頭に来るようにデータを動かすバレルシフタ【００７３】
ペイロード抽出部６２１では、これらの回路要素が同時に動作する。これにより、圧縮データのビットストリームの中から１サイクル毎に１つの圧縮ペイロードが抽出される。各圧縮ペイロードは、１サイクル毎に符号展開部６２２および文字解決部６２３のパイプラインへと渡される。【００７４】
図８は、ペイロード抽出部６２１の動作の具体例を示す。【００７５】
この図は、圧縮データ７００の構成と、パイプラインの動作を示すタイミングチャート７５０とを示す。【００７６】
駆動クロックの最初のサイクルにおいてペイロード抽出部６２１は、圧縮データ７００の中の先頭の圧縮ヘッダ７１１に示された圧縮ペイロード長に基づいて、それに続く圧縮ペイロード７２１を抽出してパイプラインに送り、分析ポインタを次の圧縮ヘッダ７１２に移動させる。次のサイクルにおいてペイロード抽出部６２１は、圧縮ヘッダ７１２に示された圧縮ペイロード長に基づいて、それに続く圧縮ペイロード７２１を抽出してパイプラインへ送り、分析ポインタを次の圧縮ヘッダ７１３に移動させる。次のサイクルにおいてペイロード抽出部６２１は、圧縮ヘッダ７１３に示された圧縮ペイロード長に基づいて、それに続く圧縮ペイロード７２３を抽出してパイプラインに送り、分析ポインタを次の圧縮ヘッダ７１４に移動させる。以下、同様にしてペイロード抽出部６２１は、圧縮データの最後までの圧縮ペイロードを抽出する。【００７７】
タイミングチャート７５０は、各圧縮ペイロードに対し、符号展開部６２２および文字解決部６２３のパイプラインによるデータ伸張の動作期間を示している。【００７８】
動作期間７３１は圧縮ペイロード７２１が符号展開部６２２で処理されるタイミングを示す。動作期間７３２は圧縮ペイロード７２２が符号展開部６２２で処理されるタイミングを示す。動作期間７３３は圧縮ペイロード７２３が符号展開部６２２で処理されるタイミングを示す。【００７９】
動作期間７４１は圧縮ペイロード７２１が文字解決部６２３で処理されるタイミングを示す。動作期間７４２は圧縮ペイロード７２２が文字解決部６２３で処理されるタイミングを示す。動作期間７４３は圧縮ペイロード７２３が文字解決部６２３で処理されるタイミングを示す。【００８０】
このように、圧縮データ７００を構成する複数の圧縮ペイロードのそれぞれが、符号展開部６２２および文字解決部６２３のパイプライン処理のタイミングは、１サイクルずつずれている。平文ブロック長が８バイトである場合、符号展開部６２２および文字解決部６２３は８個のパイプライン処理を同時に行う。符号展開部６２２のパイプラインは、８サイクルで圧縮ペイロードを中間ブロックに変換し、文字解決部６２３のパイプラインは、１サイクルで中間ブロックを平文ブロックに変換する。【００８１】
図９は、符号展開部６２２の構成および動作の具体例を示す。【００８２】
符号展開部６２２は、ビットパタンデコーダ８００を有し、各圧縮ペイロードのビットストリームの先頭部分をビットパタンデコーダ８００で分析する。ビットパタンデコーダ８００は、その圧縮ペイロードに対応する中間ブロックを生成する機能を持つ。中間ブロックとはデータ伸張処理の中間データであり、平文ブロックと同じ長さを有し、Ｎ文字（８文字）の要素を有する。【００８３】
前述のように、圧縮ペイロードの要素はリテラル文字を示すビットパタン、またはコピー記号［Ｌ，Ｊ］を示すビットパタンである。ビットパタンデコーダ８００は、ビットストリームの先頭でリテラル文字を示すビットパタンを検出した場合、中間ブロック上に当該リテラル文字を追記する。また、ビットパタンデコーダ８００は、コピー記号［Ｌ，Ｊ］を示すビットパタンを検出した場合、中間ブロック上にコピー長Ｌと同じ数の未確定文字［Ｊ］を追記する。【００８４】
この具体例は、前述の圧縮ペイロード７２３に対する符号展開部６２２の動作を示す。例えば、圧縮ペイロード７２３は、「ｅ，ｇ，ｃ，［３，Ｊ］，ａ，ｂ」のビットストリームである。この図の圧縮ペイロード７２３において最下段が、先頭のビットパタンを示す。パイプラインにおける圧縮ペイロード７２３の処理は、タイミングチャート７５０の時刻Ｔ０から時刻Ｔ８に渡って行われる。【００８５】
時刻Ｔ０において符号展開部６２２は、圧縮ペイロード７２３のビットストリームから最初の「ｅ」のビットパタンを検出する。時刻Ｔ１において符号展開部６２２は、中間ブロックにリテラル文字「ｅ」８１１を設定する。同時に符号展開部６２２は、ビットストリームを前方にシフトし、次の「ｇ」のビットパタンを検出する。時刻Ｔ２において符号展開部６２２は、中間ブロックにリテラル文字「ｇ」８１２を追記する。同時に符号展開部６２２は、ビットストリームを前方にシフトし、次の「ｃ」のビットパタンを検出する。時刻Ｔ３において符号展開部６２２は、中間ブロックにリテラル文字「ｃ」８１３を追記する。同時に符号展開部６２２は、ビットストリームを前方にシフトし、コピー記号［３，Ｊ］のビットパタンを検出する。時刻Ｔ４において符号展開部６２２は、中間ブロックに３個の未確定文字［Ｊ］８１４を追記する。同時に符号展開部６２２は、ビットストリームを前方にシフトし、「ａ」のビットパタンを検出する。時刻Ｔ５において符号展開部６２２は、中間ブロックにリテラル文字「ａ」８１５を追記する。同時に符号展開部６２２は、ビットストリームを前方にシフトし、「ｂ」のビットパタンを検出する。時刻Ｔ６において符号展開部６２２は、中間ブロックにリテラル文字「ｂ」８１６を追記する。以上で符号展開部６２２は、中間ブロックにＮ文字（８文字）の記入を完了する。同時に符号展開部６２２は、ビットストリームを前方にシフトし、その結果ビットストリームは空になる。【００８６】
ここからＴ８まで符号展開部６２２は、ビットパタン分析を行なわない。そのため、時刻Ｔ７およびＴ８では中間ブロックの内容も変化しない。タイミングチャート７５０は、符号展開部６２２において中間ブロックの内容が変化しない期間を斜線で示す。圧縮ペイロードがどんなビットストリームであっても、最大Ｎバイト（８バイト）のビットパタン列であるので、符号展開部６２２に入ってからＮサイクル（８サイクル）後において、それに対応する中間ブロックは必ず完成する。【００８７】
これにより、圧縮ペイロード７２３は中間ブロック「ｅ，ｇ，ｃ，［Ｊ］，［Ｊ］，［Ｊ］，ａ，ｂ」に変換される。この中間ブロックにおいて、５つのリテラル文字（ｅ，ｇ，ｃ，ａ，ｂ）は、その文字が平文ブロックのその位置に入ることを意味している。一方、３つの未確定文字［Ｊ］は、数値Ｊを示し、Ｊだけ過去に離れたところにあるリテラル文字が平文ブロックのその位置に入るということを意味するだけで、何の文字が入るかはまだ解決していない。この後、文字解決部６２３が未確定文字の解決を行う。【００８８】
この具体例における符号展開部６２２は、Ｎ段（８段）パイプライン形式の演算回路なので、横方向に８つ並んでいるビットパタンデコーダ８００により、８つの圧縮ペイロードのビットストリームが同時に処理される。この具体例は、圧縮ペイロード７２３に対する符号展開部６２２の処理だけを示しているが、同時に他の７つの圧縮ペイロードに対する処理も他のレジスタ上で進行している。例えば、時刻Ｔ３において、圧縮ペイロード７２３に対応する中間ブロックが左から３列目のレジスタ上にあり、圧縮ペイロード７２２対応する中間ブロックは左から４列目のレジスタ上にあり、圧縮ペイロード７２１対応する中間ブロックは左から５列目のレジスタ上にある。【００８９】
符号展開部６２２が圧縮ペイロード内の符号語がリテラル文字を示す場合に符号語をリテラル文字に変換し、符号語がリテラル文字以外を示す場合に未確定であることを示す未確定文字に変換することにより、圧縮ペイロードからＮ文字の長さを有する中間ブロックを生成することができる。これにより、後段の文字解決部６２３が、１サイクルにＮ文字ずつ処理することができる。【００９０】
図１０は、文字解決部６２３の構成および動作の具体例を示す。【００９１】
文字解決部６２３は、符号展開部６２２の後に続く処理として設置され、辞書レジスタ９００とデータセレクタ９１０とを有する。辞書レジスタ９００は、スライド辞書を実現する。データセレクタ９１０は、符号展開部６２２から出力された中間ブロックの中に含まれる未確定文字を検出する。そして、データセレクタ９１０は、辞書レジスタ９００の中から当該未確定文字９０１が指し示す文字を選択し、当該未確定文字を選択された文字に置き換えることにより平文ブロックを生成して出力すると共に、辞書レジスタ９００へ入力する。【００９２】
この具体例は、圧縮ペイロード７２３に対応する中間ブロック９２０に対する文字解決部６２３の動作を示す。中間ブロック９２０は、時刻Ｔ８に文字解決部６２３へ入力される。この図の中間ブロック９２０において最下段が、先頭の文字を示す。データセレクタ９１０は、中間ブロック９２０の中から長さ３の未確定文字列９０１を検出する。その後、データセレクタ９１０は、未確定文字列９０１の位置からＪ文字前の長さ３の文字列を辞書レジスタ９００から選択する。例えば、未確定文字列９０１においてＪが２６を示す場合、辞書レジスタ９００において２６文字前の「ｘ，ｙ，ｚ」の文字列９０２が対応する。この図の辞書レジスタ９００において、各列が平文ブロックを示し、平文ブロック内の文字の下方の位置が過去の文字を示す。平文ブロック内の文字の右方の位置が平文ブロック長だけ過去の文字を示す。したがってデータセレクタ９１０は、未確定文字列９０１を文字列９０２に置き換えることにより、文字列９０３を確定させる。これにより、時刻Ｔ９に、圧縮ペイロード７２３に対応する平文ブロック９０４「ｅ，ｇ，ｃ，ｘ，ｙ，ｚ，ａ，ｂ」が復元される。【００９３】
復元されたＮ文字（８文字）の平文ブロック９０４は、伸張回路６２０から平文データの一部として出力されると同時に、辞書レジスタ９００に追加される。辞書レジスタはＮ文字（８文字）単位のシフトレジスタになっており、左端から新しい平文ブロックが追加されると、最も古い平文ブロックは右端から捨てられる。辞書レジスタ９００の段数は、辞書サイズをＮで割った数である。【００９４】
文字解決部６２３が未確定文字を辞書レジスタ９００内のリテラル文字に置き換えることにより、平文ブロックを復元することができる。また、文字解決部６２３が１サイクルにＮ文字ずつ処理することにより、出力スループットを駆動クロックのＮ倍にすることができる。【００９５】
このように、伸張回路６２０は、複数の圧縮ブロックの夫々の圧縮ヘッダを認識することにより、認識されたヘッダ内に示されているペイロード長に基づいて圧縮データからペイロードを抽出することができる。更に、スライド辞書型圧縮アルゴリズムを用いてペイロードを伸張することにより平文ブロックを復元することができる。【００９６】
また、ペイロード抽出部６２１が圧縮データから１サイクル当たり１つの圧縮ペイロードを抽出し、符号展開部６２２および文字解決部６２３のパイプラインが平文ブロックを復元し、平文データを１サイクル当たりＮ文字ずつ出力することができる。したがって、スライド辞書型圧縮アルゴリズムによって圧縮されたデータの伸張のスループットがデータ内容によらず常に所定の値となる。そのスループットはハードウェアの設計段階で任意に定めることができる。これにより、例えば、データ圧縮機能を持つストレージシステムにおいて、圧縮されたデータに対しても高速なリード性能を保証できる。【００９７】
ソフトウェアがスライド辞書型アルゴリズムによりデータ圧縮・伸張を行う場合、ファイル単位で圧縮する場合が多い。したがって、平文データのサイズは大きく、辞書サイズも大きくなる。一方、本実施例のフラッシュメモリストレージ１１０は例えばページ（数ｋＢ）単位で読み書きを行うため、ソフトウェアによるデータ圧縮・伸張に比べて、平文データのサイズを小さくすることができ、辞書サイズも小さくすることができる。
【実施例２】
【００９８】
以下、圧縮データのサイズをより小さくして、圧縮率を向上させるための実施例について説明する。【００９９】
実施例１は、ＬＺ７７圧縮を用いて過去の文字列に一致する文字列をコピー記号に変換することにより、データ量を減らしているが、本実施例では、更に二次的圧縮を行う。二次的圧縮は、複数の連続するコピー記号のコピー距離Ｊが同じである場合に、それらを結合して１つのコピー記号にすることによって、さらにデータ量の削減を行う。【０１００】
図１１は、実施例２の圧縮伸張回路１０４の構成を示す。【０１０１】
この図において、実施例１と同一符号が付された要素は、実施例１の圧縮伸張回路１０４の要素と同一または相当物を示す。本実施例の圧縮部６１７は、実施例１における圧縮部６１７の要素に加えて、二次的圧縮のための変換部６１５を有する。本実施例の抽出部６２７は、実施例１における抽出部６２７の要素に加えて、二次的圧縮に対する伸張のための逆変換部６２５を有する。【０１０２】
変換部６１５は、連続する複数の圧縮ペイロードの夫々が一つのコピー記号であり、且つそれらのコピー記号のコピー距離Ｊが同じ場合、それらのコピー記号を一つのコピー記号に変換する。【０１０３】
図１２は、二次的圧縮の具体例を示す。【０１０４】
この図は、Ｎが８である場合を示す。ペイロード生成部６１２が、３つの連続する平文ブロックの文字列と同じ文字列を、スライド辞書中のＪ文字だけ過去の位置に発見したとする。この例において３つの連続する平文ブロックの文字列の長さは、８文字×３＝２４文字である。ペイロード生成部６１２は、実施例１と同様のデータ圧縮処理により、これら３つの平文ブロックを圧縮ペイロード１０１１、１０１２、１０１３にそれぞれ変換する。圧縮ペイロード１０１１、１０１２、１０１３のそれぞれは、コピー記号［８，Ｊ］になり、同じコピー記号が３つ連続して並ぶ。そして、ヘッダ生成部６１３は、圧縮ペイロード１０１１、１０１２、１０１３に、圧縮ヘッダ１００１、１００２、１００３を付加する。【０１０５】
３つの連続する圧縮ペイロード１０１１、１０１２、１０１３のコピー記号のコピー距離Ｊが同じなので、変換部６１５は、３つのコピー記号のコピー長さの８を合計して１つのコピー長さの２４にまとめ、３つのコピー記号［８，Ｊ］を一つのコピー記号［２４，Ｊ］に変換することにより、圧縮ペイロード１０２１を生成する。更に変換部６１５は、圧縮ヘッダ１００１、１００２、１００３を、圧縮ペイロード１０２１の長さを示す圧縮ヘッダ１０２０に変換する。この変換により、圧縮ヘッダおよび圧縮ペイロードの組は３個から１個に減るので、実施例１に比べて圧縮データのデータ量をさらに減らすことができる。更に、圧縮ヘッダ１０２０は、圧縮ペイロード１０２１が結合されたコピー記号であることを示す結合情報を含む。【０１０６】
このように圧縮回路６１０は、変換部６１５以外の処理について、実施例１と同様に処理することができる。【０１０７】
二次的圧縮を施した圧縮データを伸張するために、逆変換部６２５は、圧縮ヘッダ１０２０が結合情報を含むか否かを判定する。圧縮ヘッダ１０２０が結合情報を含む場合、逆変換部６２５は、後に続く１個の圧縮ペイロード２０１１から結合されたコピー記号を取得し、変換部６１５の逆変換として、それを複数（Ｍ個）のコピー記号に変換し、Ｍ個の圧縮ペイロード１０１１、１０１２、１０１３を生成する。ここで、結合されたコピー記号におけるコピー長さＬはＮ×Ｍである。それらを１つずつＭサイクルかけて符号展開部６２２に渡す。圧縮ヘッダ１０２０が結合情報を含まない場合、ペイロード抽出部６２１は、実施例１と同様にして１サイクル当たり１つの圧縮ペイロードを符号展開部６２２に渡す。【０１０８】
このように伸張回路６２０は、逆変換部６２５以外の処理について、実施例１と同様に処理することができる。【０１０９】
なお、抽出部６２７は、結合情報を用いずに、圧縮ペイロードが結合されたコピー記号であることを判定しても良い。例えば、圧縮ペイロードがコピー記号を示し、且つそのコピー長さが平文ブロック長のＭ倍を示す場合、抽出部６２７は、圧縮ペイロードを連続するＭ個のコピー記号に変換しても良い。【０１１０】
以下、前述の実施例の変形例について説明する。【０１１１】
圧縮回路６１０と伸張回路６２０は、互いに異なる装置であっても良い。【０１１２】
第１変形例として、ストレージコントローラと、ストレージコントローラに接続されている第１のストレージ装置と、ストレージコントローラに接続されている第２のストレージ装置とを有するストレージシステムの例について説明する。ここで、第１のストレージ装置が圧縮回路６１０を有し、第２のストレージ装置が伸張回路６２０を有する。第１のストレージ装置が読み出したデータを圧縮回路６１０により圧縮して圧縮データに変換し、圧縮データをストレージコントローラへ送信し、ストレージコントローラは、受信した圧縮データを第２のストレージ装置へ送信し、第２のストレージ装置は、受信した圧縮データを伸張回路６２０により伸張して格納する。この場合、データの転送量を減らすことにより、ストレージコントローラや、ストレージコントローラと第１のストレージ装置の間の通信線や、ストレージコントローラと第２のストレージ装置の間の通信線の負荷を低減することができる。【０１１３】
第２変形例として、第１の通信装置と、ネットワークを介して第１の通信装置に接続されている第２の通信装置とを有する通信システムの例について説明する。ここで、第１の通信装置が圧縮回路６１０を有し、第２の通信装置が伸張回路６２０を有する。第１の通信装置が入力されたデータを圧縮回路６１０により圧縮して圧縮データに変換し、圧縮データを第２の通信装置へ送信し、第２の通信装置は、受信した圧縮データを伸張回路６２０により伸張して出力する。この場合、データの転送量を減らすことにより、ネットワークの負荷を低減することができる。また、伸張回路６２０が予め定められた出力スループットで伸張を行うため、ネットワークの通信速度を保証することができる。【０１１４】
フラッシュメモリストレージ１０１がキャッシュ装置であっても良い。【０１１５】
第３変形例として、フラッシュメモリストレージ１０１をキャッシュ装置として用いる計算機システムの例について説明する。第３変形例の計算機システムは、実施例１の計算機システムの要素に加え、ストレージ装置としてＨＤＤまたはフラッシュメモリデバイスを有する。ストレージ装置は、上位コントローラ１１０に接続されている。上位コントローラ１１０は、ライトコマンドに応じて、ライトデータをキャッシュ装置へ転送する。キャッシュ装置において、圧縮回路６１０は、ライトデータを圧縮することにより圧縮ライトデータを生成し、フラッシュメモリ１０５は圧縮ライトデータを格納する。フラッシュメモリ１０５は、ライトデータを格納しても良い。上位コントローラ１１０は、圧縮ライトデータをストレージ装置へ転送し、ストレージ装置へ書き込む。また、上位コントローラ１１０は、リードコマンドに応じて、ストレージ装置内のデータを読み出して圧縮リードデータとし、ストレージ装置からキャッシュ装置へ転送する。キャッシュ装置において、フラッシュメモリ１０５は圧縮リードデータを格納し、伸張回路６２０は、圧縮リードデータを伸張することによりリードデータを生成する。フラッシュメモリ１０５は、リードデータを格納しても良い。上位コントローラ１１０は、キャッシュ装置からリードデータを転送する。これにより、ストレージ装置へ格納するデータ量を削減できると共に、キャッシュ装置とストレージ装置の間のデータの転送量を削減することができる。また、計算機システムにおけるリードのスループットを保証することができる。【０１１６】
以上に述べた実施例および変形例において、圧縮回路６１０および伸張回路６２０は、ＬＺ７７以外のスライド辞書型圧縮アルゴリズムを用いても良い。
【符号の説明】
【０１１７】
１０１：フラッシュメモリストレージ、  １０３：フラッシュメモリコントローラ、  １０４：圧縮伸張回路、  １０５：フラッシュメモリ、  １０７：マイクロプロセッサ、 １１０：上位コントローラ、  ６１０：圧縮回路、  ６１１：分割部、  ６１２：ペイロード生成部、  ６１３：ヘッダ生成部、  ６１５：変換部、  ６１６：連結部、  ６１７：圧縮部、  ６２０：伸張回路、  ６２１：ペイロード抽出部、  ６２２：符号展開部、  ６２３：文字解決部、  ６２５：逆変換部、  ６２７：抽出部、  ６２８：伸張部
【図１】
0006009676.tif 000002
【図２】
0006009676.tif 000003
【図３】
0006009676.tif 000004
【図４】
0006009676.tif 000005
【図５】
0006009676.tif 000006
【図６】
0006009676.tif 000007
【図７】
0006009676.tif 000008
【図８】
0006009676.tif 000009
【図９】
0006009676.tif 000010
【図１０】
0006009676.tif 000011
【図１１】
0006009676.tif 000012
【図１２】
0006009676.tif 000013