(57)【要約】【課題】処理性能及び圧縮率を向上させる情報処理装置、データ圧縮方法及びデータ圧縮プログラムを提供する。【解決手段】特定部１２は、入力データを所定サイズ毎に分けた場合の区分位置を特定する。共通領域圧縮部１５は、入力データを圧縮した圧縮データにおける両端からのサイズが所定サイズ以上となる位置及び隣合う区分位置を挟みその間のサイズが所定サイズ以上となる位置に対応する入力データにおける圧縮位置を特定し、入力データにおける区分位置を挟んで並ぶ圧縮位置で挟まれた各先圧縮データの圧縮を行う。個別領域圧縮部１６は、入力データにおける先圧縮データで分割された後圧縮データ毎に、後圧縮データに隣接する先圧縮データ及び各後圧縮データを基に圧縮を行う。【選択図】図１
2018132991.tif 000002
【特許請求の範囲】
【請求項１】
入力データを所定サイズ毎に分けた場合の区分位置を特定する特定部と、
前記入力データを圧縮した圧縮データにおける両端からのサイズが所定サイズ以上となる位置及び隣合う前記区分位置を挟みその間のサイズが所定サイズ以上となる位置に対応する前記入力データにおける圧縮位置を特定し、前記入力データにおける前記区分位置を挟んで並ぶ前記圧縮位置で挟まれた各先圧縮データの圧縮を行う先圧縮部と、
前記入力データにおける前記先圧縮データで分割された後圧縮データ毎に、前記後圧縮データに隣接する前記先圧縮データ及び各前記後圧縮データを基に圧縮を行う後圧縮部と
を備えたことを特徴とする情報処理装置。
【請求項２】
前記所定サイズは、前記入力データの半分のサイズであり、
前記特定部は、前記入力データの中心位置を特定し、
前記先圧縮部は、前記圧縮データにおいて前記両端のそれぞれからのサイズが所定サイズとなる位置に対応する前記入力データにおける２つの前記圧縮位置を予測し、前記入力データにおける各前記圧縮位置で挟まれた前記先圧縮データの圧縮を行い、
前記後圧縮部は、前記入力データにおける前記先圧縮データで分割された２つの前記後圧縮データ毎に、前記先圧縮データ及び各前記後圧縮データを基に圧縮を行う
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記先圧縮部は、
前記圧縮データにおいて前記両端の一方からのサイズが所定サイズとなる位置に対応する前記入力データにおける第１圧縮位置を予測し、前記中心位置から前記第１圧縮位置までの第１データに対して、前記中心位置から前記第１圧縮位置に向けて前記第１データを基に第１圧縮を行う第１圧縮部と、
前記圧縮データにおいて前記両端の他方からのサイズが前記所定サイズとなる位置に対応する前記入力データにおける第２圧縮位置を予測し、前記中心位置から前記第２圧縮位置までの第２データに対して、前記中心位置から前記第２圧縮位置に向けて前記第１データ及び前記第２データを基に第２圧縮を行う第２圧縮部とを備え、
前記後圧縮部は、
前記第１圧縮位置から、前記入力データにおける先頭又は後尾の近い方の第１端部までの第３データに対して、前記第１圧縮位置から前記第１端部に向けて、前記第１データ、前記第２データ及び前記第３データを基に第３圧縮を行う第３圧縮部と、
前記第２圧縮位置から、前記入力データにおける先頭又は後尾の近い方の第２端部までの第４データに対して、前記第２圧縮位置から前記第２端部に向けて、前記第１データ、前記第２データ及び前記第４データを基に第４圧縮を行う第４圧縮部とを備えた
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記第１圧縮、前記第２圧縮、前記第３圧縮及び前記第４圧縮により生成された前記圧縮データを記憶部に格納する格納処理部と、
前記入力データのうちの前半のデータの読み出し要求を受けた場合、前記入力データの管理データを基に、前記圧縮データの先端から所定サイズのデータを読み出して展開し、展開したデータの先端から所定サイズのデータを取得し、前記入力データのうちの後半のデータの読み出し要求を受けた場合、前記管理データを基に、前記第１圧縮位置及び前記第２圧縮位置のうち前記入力データの先端に近い方に対応する前記圧縮データの上の基準位置から前記圧縮データの後端までのデータを読み出して展開し、展開したデータの先端から所定サイズのデータを取得する展開部をさらに備え、
前記第２圧縮部は、前記基準位置と前記圧縮データの中心位置との第１相対距離を、前記圧縮データの前記基準位置に登録し、
前記格納処理部は、前記記憶部における前記圧縮データ上の先端の位置及び前記圧縮データの先端の位置から前記基準位置までの第２相対距離を前記管理データに登録する
ことを特徴とする請求項３に記載の情報処理装置。
【請求項５】
前記第１圧縮部は、前記入力データの圧縮を前記中心位置から前記圧縮データにおける前記両端の前記他方に向けて圧縮を実行していきながら第１圧縮率を算出し、算出した前記第１圧縮率から前記両端の一方から圧縮を終えた位置までの前記圧縮データの第２圧縮率を推測して、前記第１圧縮位置を予測する、
前記第２圧縮部は、前記入力データの圧縮を前記中心位置から前記圧縮データにおける前記両端の一方に向けて圧縮を実行していきながら第３圧縮率を算出し、算出した前記第３圧縮率から前記両端の前記他方から圧縮を終えた位置までの前記圧縮データの第４圧縮率を推測して、前記第２圧縮位置を予測する
ことを特徴とする請求項３又は４に記載の情報処理装置。
【請求項６】
前記第１圧縮部、前記第２圧縮部、前記第３圧縮部及び前記第４圧縮部により生成された前記圧縮データにおいて前記第１圧縮位置に対応する位置から前記両端の一方までのサイズが所定サイズを超える場合、又は、前記第２圧縮位置に対応する位置から前記両端の前記他方までのサイズが所定サイズを超える場合、前記第２圧縮部、前記第３圧縮部及び前記第４圧縮部による圧縮結果を破棄して、前記入力データの先端から前記中心位置までの前半のデータに対して、前記前半のデータを基に圧縮を行い、且つ、前記入力データの中心位置から後端までの後半のデータに対して、前記後半のデータを基に圧縮を行う再圧縮部をさらに備えたことを特徴とする請求項３〜５のいずれか一つに記載の情報処理装置。
【請求項７】
入力データを所定サイズ毎に分けた場合の区分位置を特定し、
前記入力データを圧縮した圧縮データにおける両端及び前記区分位置のそれぞれからのサイズが所定サイズとなる位置に対応する前記入力データにおける圧縮位置を予測し、
前記入力データにおける前記区分位置を挟んで並ぶ前記圧縮位置で挟まれた各先圧縮データの圧縮を行い、
前記入力データにおける前記先圧縮データで分割された後圧縮データ毎に、前記後圧縮データに隣接する前記先圧縮データ及び各前記後圧縮データを基に圧縮を行う
ことを特徴とするデータ圧縮方法。
【請求項８】
入力データを所定サイズ毎に分けた場合の区分位置を特定し、
前記入力データを圧縮した圧縮データにおける両端及び前記区分位置のそれぞれからのサイズが所定サイズとなる位置に対応する前記入力データにおける圧縮位置を予測し、
前記入力データにおける前記区分位置を挟んで並ぶ前記圧縮位置で挟まれた各先圧縮データの圧縮を行い、
前記入力データにおける前記先圧縮データで分割された後圧縮データ毎に、前記後圧縮データに隣接する前記先圧縮データ及び各前記後圧縮データを基に圧縮を行う
処理をコンピュータに実行させることを特徴とするデータ圧縮プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、データ圧縮方法及びデータ圧縮プログラムに関する。
【背景技術】
【０００２】
ＳＳＤ（Solid  State  Drive）は、ハードディスクに比べて読み書きが早く且つ消費電力が少ないという大きなメリットを有する。そして、近年、ＳＳＤの低価格化が進んだことで、ＳＳＤの実用性が高まり、ＳＳＤを用いたストレージ装置の実用化が進んできた。複数のＳＳＤを連結した大規模な記憶装置は、オールフラッシュアレイ（ＡＦＡ：All  Flash  Array）と呼ばれる。ＡＦＡを備えたストレージ装置は、例えば、演算処理装置であるＣＰＵ（Central  Processing  Unit）、複数のＤＲＡＭ（Dynamic  Random  Access  Memory）で構成されたＤＩＭＭ（Dual  Inline  Memory  Module）及びＳＳＤを有する。
【０００３】
ＡＦＡでは、ＳＳＤを使用することから、書き込み回数の低減及び保存データ量の縮小が望まれる。それらの要求に答えるため、ＡＦＡでは、重複除去及び圧縮の２つの技術が活用されている。
【０００４】
重複除去とは、重複したデータはＡＦＡの中の１カ所にのみ保存し、そのデータを持つ全てのファイルにその箇所を参照させる技術である。圧縮は、メモリからＳＳＤへデータを書き込む際に圧縮して保存し、ＳＳＤから圧縮されたデータをメモリ上に読み込み、メモリ上に展開する技術である。圧縮手法としては、前方を参照し、同じパターンを省略して圧縮するＬＺ（Lempel-Ziv）系の圧縮が用いられる場合が多い。ＬＺ系の圧縮を用いた場合、高速な展開が可能となる。
【０００５】
重複除去の技術では、ＡＦＡは、ＳＳＤに格納された各データに関する情報が格納されたメタデータを用いてＳＳＤに格納された各データの管理を行う。メタデータは、重複除去や圧縮の処理の高速化のために常にメモリ上に配置される。
【０００６】
例えば、重複除去を実現するにあたり、メタデータは、ＳＳＤに保存されたデータのＰＢＡ（Physical  Block  Address）や重複除去に用いるハッシュ値を有する。そして、メタデータを用いてＳＳＤに格納されたデータを管理する場合、各メタデータが管理するデータサイズは、大きすぎても小さすぎても性能低下が生じてしまう。
【０００７】
例えば、データサイズが小さいと、ＤＲＡＭに配置するメタデータ数が増加し、メタデータが占有するメモリ量も増加するため、他の処理に使用可能なメモリ量が減少し、性能が低下してしまう。また、データサイズが大きいと、メモリ上のキャッシュサイズも大きくなり、使用しないデータをＤＲＡＭに置くなどメモリ量の浪費が発生するため、他の処理に使用可能なメモリ量が減少し、性能が低下してしまう。そこで、メタデータが管理するデータサイズは、メタデータ数やキャッシュサイズなどを基に決定されることが好ましい。例えば、メタデータが管理するデータサイズは、８ＫＢとされる。
【０００８】
このように、ＡＦＡでは、メタデータが管理するデータサイズの単位で重複除去を行う。例えば、メタデータが管理するデータサイズを８ＫＢとすると、ＡＦＡでは、８ＫＢ単位で重複除去の処理が行われる。
【０００９】
一方、ＳＳＤでは、様々なアプリケーションにおいて４ＫＢ単位のデータアクセスが多々発生することから、ページサイズとして４ＫＢ単位で性能が最適化されている製品が一般的である。
【００１０】
なお、データを分割し、同一内容のデータは、共通データとして１つにまとめて圧縮する従来技術がある。また、画像を所定のブロックに分割して圧縮し、復元時に部分的に復元が行えるようにする従来技術がある。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２０１０−６１５１８号公報
【特許文献２】特開２００３−３１９１８６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、上述したようにＡＦＡにおけるデータの管理サイズとＳＳＤでのデータの単位サイズが異なることが考えられる。その場合、データの読み出し要求に対して、ＡＦＡにおいて無駄なデータの読み出しが発生するおそれがある。例えば、ＡＦＡが８ＫＢ単位でデータを管理し、ＳＳＤに格納されたデータへのアクセスが４ＫＢで行われる場合、４ＫＢのデータの読み出し要求に対して、ＡＦＡは、８ＫＢのデータを読み出して展開し、展開した中から指定された４ＫＢ分のデータを用いて応答することになり、４ＫＢ分のデータの読み出し及び展開が無駄になる。このように、従来のＡＦＡにおける圧縮技術を用いた場合、データの取り扱いサイズの不整合のため、圧縮展開での性能が低下し、ＩＯＰＳ（Input  Output  Per  Second）といった処理能力が低下するおそれがある。
【００１３】
そこで、８ＫＢのデータを４ＫＢ毎に分割して圧縮し、境界を記憶しておくことが考えられる。この場合、４ＫＢのデータの読み出し要求に対しては、読み出した４ＫＢのデータを読み出して展開することができる。例えば、８ＫＢをまとめて圧縮した場合、４ＫＢのデータの読み出し要求に対するＩＯＰＳは、２８５ＫＩＯＰＳであるのに対して、４ＫＢ毎に分割して圧縮した場合、４ＫＢのデータの読み出し要求に対するＩＯＰＳは４６０ＫＩＯＰＳとなる。しかし、４ＫＢ毎に分割して圧縮した場合、８ＫＢをまとめて圧縮する場合に比較して圧縮率が低下してしまう。そのため、ＡＦＡにおいて格納できるデータ量が低下する。
【００１４】
また、データを分割し、同一内容のデータを共通データとして１つにまとめて圧縮する従来技術を用いても、データの取り扱いサイズが不整合の場合、４ＫＢ毎に分割して圧縮する場合と同様のデータの取り扱いとなり、圧縮率は低下してしまうおそれがある。また、復元時に部分的に復元を行う従来技術を用いても、データの取り扱いサイズが不整合の場合の圧縮データに起因する処理能力の低下や圧縮率の低下が発生するおそれがある。
【００１５】
開示の技術は、上記に鑑みてなされたものであって、処理性能及び圧縮率を向上させる情報処理装置、データ圧縮方法及びデータ圧縮プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１６】
本願の開示する情報処理装置、データ圧縮方法及びデータ圧縮プログラムの一つの態様において、特定部は、入力データを所定サイズ毎に分けた場合の区分位置を特定する。先圧縮部は、前記入力データを圧縮した圧縮データにおける両端からのサイズが所定サイズ以上となる位置及び隣合う前記区分位置を挟みその間のサイズが所定サイズ以上となる位置に対応する前記入力データにおける圧縮位置を特定し、前記入力データにおける前記区分位置を挟んで並ぶ前記圧縮位置で挟まれた各先圧縮データの圧縮を行う。後圧縮部は、前記入力データにおける前記先圧縮データで分割された後圧縮データ毎に、前記後圧縮データに隣接する前記先圧縮データ及び各前記後圧縮データを基に圧縮を行う。
【発明の効果】
【００１７】
１つの側面では、本発明は、処理性能及び圧縮率を向上させることができる。
【図面の簡単な説明】
【００１８】
【図１】図１は、実施例１に係るＡＦＡのブロック図である。
【図２】図２は、実施例１に係るメタデータの一例を示す図である。
【図３】図３は、第１圧縮部による圧縮の開始状態を表す図である。
【図４】図４は、第１圧縮部による圧縮の開始時におけるデータの状態を詳細に表した図である。
【図５】図５は、第１圧縮部がｉｐポインタを移動した状態を表す図である。
【図６】図６は、第１圧縮部が同じｖａｌｕｅを有するデータを見つけた状態を表す図である。
【図７】図７は、第１圧縮部がマッチする位置を確定させた状態を表す図である。
【図８】図８は、第１圧縮部による圧縮が完了した状態を示す図である。
【図９】図９は、第２圧縮部による圧縮の開始状態を表す図である。
【図１０】図１０は、第２圧縮部が同じｖａｌｕｅを有するデータを見つけた状態を表す図である。
【図１１】図１１は、第２圧縮部がマッチする位置を確定させた状態を表す図である。
【図１２】図１２は、第２圧縮部による圧縮が完了した状態を示す図である。
【図１３】図１３は、第４圧縮部による圧縮状態を表す図である。
【図１４】図１４は、第３圧縮部による圧縮の開始状態を表す図である。
【図１５】図１５は、第３圧縮部による圧縮の開始状態を表す図である。
【図１６】図１６は、実施例１に係る再圧縮部による入力データの再圧縮について説明するための図である。
【図１７】図１７は、前半データの展開を説明するための図である。
【図１８】図１８は、後半データの展開を説明するための図である。
【図１９】図１９は、実施例１に係るＡＦＡによるデータの重畳圧縮の処理のフローチャートである。
【図２０】図２０は、各圧縮方法を用いた場合の読み出し時のＩＯＰＳ及び圧縮率の比較を表す図である。
【図２１】図２１は、実施例１の変形例における圧縮の順番を説明するための図である。
【図２２】図２２は、実施例２における前半データの再圧縮について説明するための図である。
【図２３】図２３は、実施例２における後半データの再圧縮について説明するための図である。
【図２４】図２４は、実施例２に係る再圧縮の処理のフローチャートである。
【図２５】図２５は、実施例３に係るＡＦＡによる圧縮処理の概要を説明するための図である。
【図２６】図２６は、実施例４に係るＡＦＡのブロック図である。
【図２７】図２７は、実施例４に係るＡＦＡによる共通領域の圧縮について説明するための図である。
【図２８】図２８は、実施例４に係るＡＦＡによる個別領域の圧縮について説明するための図である。
【図２９】図２９は、実施例４に係るメタデータの一例を表す図である。
【図３０】図３０は、ＡＦＡのハードウェア構成の一例の図である。
【発明を実施するための形態】
【００１９】
以下に、本願の開示する情報処理装置、データ圧縮方法及びデータ圧縮プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理装置、データ圧縮方法及びデータ圧縮プログラムが限定されるものではない。
【実施例１】
【００２０】
図１は、実施例１に係るＡＦＡのブロック図である。図１に示すように、ＡＦＡ１は、ＦＣ（Fibre  channel）３を介してサーバ２と接続される。ＡＦＡ１は、サーバ２からの指示に応じて、データの格納及び読み出しを行う。以下では、ＡＦＡ１におけるデータの圧縮及び展開を主に説明するが、実際には、ＡＦＡ１は、重複除去などの処理も実行する。
【００２１】
本実施例では、ＡＦＡ１が、重複除去を行う場合のメタデータの管理単位としてデータを８ＫＢ単位で管理しており、且つ、４ＫＢ単位でデータの読み出し及び書き込みを行う場合を例に説明する。この４ＫＢが「所定サイズ」の一例にあたる。
【００２２】
ＡＦＡ１は、送受信部１１、特定部１２、圧縮バッファ割当部１３、圧縮用情報記憶部１４、共通領域圧縮部１５、個別領域圧縮部１６、圧縮バッファ１７、再圧縮部１８、格納処理部１９、読出部２０及び記憶部３０を有する。
【００２３】
送受信部１１は、ＦＣ３を介して、サーバ２との間でデータの送受信を行う。送受信部１１は、データの書き込み命令をデータとともにサーバ２から受信する。次に、送受信部１１は、メタデータの管理単位に受信したデータを分割する。本実施例では、メタデータの管理単位は８ＫＢなので、送受信部１１は、取得したデータを８ＫＢ単位に分割する。
【００２４】
その後、送受信部１１は、分割したデータのサイズを特定部１２へ通知するとともに、分割したデータを共通領域圧縮部１５へ出力する。以下では、後述する共通領域圧縮部１５が送受信部１１から入力されたデータを、「入力データ２００」という。
【００２５】
また、送受信部１１は、データの読み出し命令をサーバ２から受信する。以下では、読み出し命令で指定されたデータを「読出データ」という。送受信部１１は、読み出し命令を読出部２０へ通知する。その後、送受信部１１は、読み出し命令に対する応答として、読出データの入力を読出部２０から受ける。そして、送受信部１１は、取得した読出データをサーバ２へ送信する。
【００２６】
特定部１２は、入力データ２００のサイズの通知を送受信部１１から受ける。本実施例では、特定部１２は、入力データ２００のサイズが８ＫＢであるという通知を送受信部１１から受ける。さらに、特定部１２は、圧縮バッファ１７のサイズの通知を圧縮バッファ割当部１３から受ける。次に、特定部１２は、入力データ２００の中心位置を特定する。ここでは、特定部１２は、入力データ２００の先頭から４ＫＢの点を入力データ２００の中心位置として特定する。さらに、特定部１２は、圧縮バッファ１７の中心位置を特定する。具体的には、特定部１２は、圧縮バッファ１７の先頭アドレスから中心位置のアドレスまでのオフセットを特定することで圧縮バッファ１７の中心位置を特定する。そして、特定部１２は、入力データ２００の中心位置の情報及び圧縮バッファ１７の中心位置の情報を共通領域圧縮部１５へ出力する。この入力データ２００の中心位置が、「区分位置」の一例にあたる。
【００２７】
圧縮バッファ割当部１３は、圧縮バッファ１７のサイズを取得する。そして、圧縮バッファ割当部１３は、圧縮バッファ１７のサイズを特定部１２に通知する。
【００２８】
ここで、圧縮バッファ１７は、アドレスが一端から他端に向けてシーケンシャルに振られる。以下では、圧縮バッファ１７のアドレスが最も若い側の端部を先端と言い、他端を後端という。また、入力データ２００は、データが一列に並ぶデータであり、且つ、圧縮された入力データ２００は一端から圧縮バッファ１７のアドレス順に格納される。以下では、格納時に最も若いアドレスに格納される側の入力データ２００の端部を先端と言い、他端を後端という。
【００２９】
ここで、本実施例では、ＡＦＡ１は、ＤＲＡＭ上に予め８ＫＢのサイズの圧縮バッファ１７が設けられる。これは、入力データ２００が８ＫＢであるので、入力データ２００を圧縮した圧縮データは８ＫＢ以下になるため、圧縮バッファ１７として８ＫＢの領域を確保すれば十分であるからである。そして、本実施例では、圧縮バッファ割当部１３は、圧縮バッファ１７のサイズを予め８ＫＢと記憶しており、その記憶したサイズを特定部１２に通知する。以下では、入力データ２００を圧縮したデータを「圧縮データ３００」という。
【００３０】
ただし、圧縮バッファ１７のサイズは動的に変更されてもよく、その場合、圧縮バッファ割当部１３は、ＤＲＡＭ上に領域を確保して圧縮バッファ１７を形成する。そして、圧縮バッファ割当部１３は、確保した領域のサイズを特定部１２に通知する。
【００３１】
圧縮用情報記憶部１４は、ハッシュテーブル１４１、ハッシュテーブル１４２及びメタデータ１４３を有する。
【００３２】
ハッシュテーブル１４１は、共通領域圧縮部１５が圧縮を行う際に利用するテーブルである。本実施例では、ハッシュテーブル１４１は、共通領域圧縮部１５が圧縮を行う際に共通領域圧縮部１５により圧縮用情報記憶部１４に作成される。ハッシュテーブル１４１は、個別領域圧縮部１６が圧縮を行う際にも利用される。
【００３３】
ハッシュテーブル１４２は、個別領域圧縮部１６が圧縮を行う際に利用するテーブルである。本実施例では、ハッシュテーブル１４２は、個別領域圧縮部１６が圧縮を行う際に個別領域圧縮部１６により圧縮用情報記憶部１４に作成される。
【００３４】
メタデータ１４３は、重複除去の処理に使用されるデータである。図２は、実施例１に係るメタデータの一例を示す図である。メタデータ１４３は、１６０ｂｉｔのハッシュ値を格納する領域を有する。このメタデータ１４３が有するハッシュ値は、重複除去の処理において用いられる情報である。
【００３５】
さらに、本実施例に係るメタデータ１４３は、自己が管理する入力データ２００を圧縮した圧縮データ３００の先頭を表すデータ先頭セクタアドレスを格納する先頭アドレス格納領域３１１を有する。さらに、メタデータ１４３は、自己が管理する入力データ２００を圧縮した圧縮データ３００の先頭から後述する共通領域の先頭までの長さを表すオフセットを格納するオフセット格納領域３１２を有する。このメタデータが、「管理データ」の一例にあたる。
【００３６】
図１に戻って説明を続ける。本実施例に係る共通領域圧縮部１５は、第１圧縮部１５１及び第２圧縮部１５２を有する。この共通領域圧縮部１５が、「先圧縮部」の一例にあたる。
【００３７】
共通領域とは、入力データ２００の内の前半４ＫＢにあたる前半データを読み出す場合に圧縮データ３００から読み出す領域と、入力データ２００の内の後半４ＫＢにあたる後半データを読み出す場合に圧縮データ３００から読み出す領域の重なる領域を指す。共通領域には、以下に説明するように、前半データの一部と後半データの一部とが含まれる。第１圧縮部１５１は、共通領域のうちの後半データにあたる部分の圧縮を行う。第２圧縮部１５２は、共通領域のうちの前半データにあたる部分の圧縮を行う。以下に、第１圧縮部１５１及び第２圧縮部１５２の詳細について説明する。
【００３８】
第１圧縮部１５１は、入力データ２００の入力を送受信部１１から受ける。また、第１圧縮部１５１は、入力データ２００の中心位置の情報及び圧縮バッファ１７の中心位置の情報の入力を特定部１２から受ける。第１圧縮部１５１は、ハッシュテーブル１４１を圧縮用情報記憶部１４に作成する。
【００３９】
次に、第１圧縮部１５１は、入力データ２００の中心位置にアンカーポインタ（anchor  pointer）及びｉｐ（input）ポインタをセットする。さらに、第１圧縮部１５１は、圧縮バッファ１７の中心位置にｏｐ（output）ポインタをセットする。図３は、第１圧縮部による圧縮の開始状態を表す図である。図３では、入力データ２００上の位置を示す「ａｎｃｈｏｒ」及び「ｉｐ」の文字が付加された矢印が、それぞれアンカーポインタ及びｉｐポインタを表す。また、圧縮バッファ１７上の位置を示す「ｏｐ」の文字が付加された矢印が、ｏｐポインタを表す。図３に示すように、アンカーポインタ及びｉｐポインタは、入力データ２００の中心位置、すなわち、先端からのサイズが４ＫＢとなり後端までのサイズが４ＫＢとなる位置に配置される。
【００４０】
さらに、第１圧縮部１５１は、ハッシュテーブル１４１を作成する。この状態では、圧縮は開始されていないので、ハッシュテーブル１４１は、空の状態である。図４は、第１圧縮部による圧縮の開始時におけるデータの状態を詳細に表した図である。以下では、第１圧縮部１５１による圧縮を圧縮Ｃ１という。図４に示すように入力データ２００は、その中に１つ１つのデータを格納する。第１圧縮部１５１は、圧縮Ｃ１の開始時に、入力データ２００の中心位置のデータにアンカーポインタ及びｉｐポインタをセットする。
【００４１】
次に、第１圧縮部１５１は、ｉｐポインタがセットされたデータをハッシングする。そして、第１圧縮部１５１は、ハッシング結果に対応するｋｅｙをハッシュテーブル１４１に登録する。さらに、第１圧縮部１５１は、登録したｋｅｙに対応させて、ｉｐポインタの位置をｖａｌｕｅとしてハッシュテーブル１４１に登録する。例えば、図４では、最初のデータ「ｐ」は１番目なので、第１圧縮部１５１は、ｖａｌｕｅを１とする。
【００４２】
次に、第１圧縮部１５１は、図５に示すように、入力データ２００の後端に向けて隣のデータにｉｐポインタを移動する。図５は、第１圧縮部がｉｐポインタを移動した状態を表す図である。そして、第１圧縮部１５１は、ｉｐポインタが示すデータをハッシングし、そのハッシング結果に対応するｖａｌｕｅが既にハッシュテーブル１４１に登録されているか否かを判定する。登録されていなければ、第１圧縮部１５１は、ｖａｌｕｅを登録し、入力データ２００の後端に向けて隣のデータにｉｐポインタを移動させる。このように、ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅがハッシュテーブル１４１に登録されていない場合、第１圧縮部１５１は、ｖａｌｕｅの登録及びｉｐポインタの移動を繰返す。
【００４３】
第１圧縮部１５１は、図６に示すように、ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅがハッシュテーブル１４１に登録されたデータを特定する。図６は、第１圧縮部が同じｖａｌｕｅを有するデータを見つけた状態を表す図である。そして、第１圧縮部１５１は、ｉｐポインタが示すデータと同じｖａｌｕｅを有するデータにマッチポインタをセットする。図６において、入力データ２００上の位置を示す「ｍａｔｃｈ」の文字が付加された矢印が、マッチポインタを表す。そして、第１圧縮部１５１は、アンカーポインタからｉｐポインタ間をｌｉｔｅｒａｌとしてエンコードを開始する。第１圧縮部１５１は、ｉｐポインタからアンカーポインタまでの長さを算出する。この算出した長さが、同じパターンのないｌｉｔｅｒａｌ長なので、第１圧縮部１５１は、ｌｉｔｅｒａｌ長１７１をｏｐポインタの示す位置から書き込む。さらに、第１圧縮部１５１は、ｌｉｔｅｒａｌ長１７１の圧縮バッファ１７の後端側の隣に、データ２０１をｌｉｔｅｒａｌの実データ１７２として書き込む。次に、第１圧縮部１５１は、ｉｐポインタからマッチポインタまでの長さ２０２を算出する。この算出した長さ２０２が、ｉｐポインタからｖａｌｕｅが一致したデータまでのオフセットなので、第１圧縮部１５１は、ｌｉｔｅｒａｌの実データ１７２の圧縮バッファ１７の後端側の隣に、算出した長さ２０２をｍａｔｃｈのオフセット１７３として書き込む。第１圧縮部１５１は、ｍａｔｃｈのオフセット１７３の後ろにｏｐポインタをセットする。
【００４４】
次に、第１圧縮部１５１は、マッチポインタ及びｉｐポインタをそれぞれ入力データ２００の後端に向けて移動させ、どこまでｖａｌｕｅが一致するかを確認する。以下では、ｖａｌｕｅが一致することをマッチするという。図７は、第１圧縮部がマッチする位置を確定させた状態を表す図である。第１圧縮部１５１は、マッチする位置が確定すると、マッチするデータ長２０３を取得する。そして、第１圧縮部１５１は、データ長２０３を、ｍａｔｃｈのオフセット１７３の圧縮バッファ１７の後端側の隣にｍａｔｃｈ長１７４として書き込む。第１圧縮部１５１は、ｍａｔｃｈ長１７４の後ろにｏｐポインタをセットする。
【００４５】
ここで、第１圧縮部１５１は、この時点での圧縮開始位置から圧縮が完了した位置までの圧縮前サイズｘ’を取得する。さらに、第１圧縮部１５１は、その時点での圧縮後サイズｃ’を取得する。
【００４６】
ここで、圧縮後サイズｃ’を圧縮前サイズｘ’で除算することで、その時点での圧縮率である暫定圧縮率ｙ’が算出できる。すなわち、暫定圧縮率ｙ’＝ｃ’／ｘ’として算出される。圧縮データ３００の先頭から４ＫＢのサイズのデータには、圧縮前の入力データ２００の先頭から４ＫＢのサイズの前半データが含まれる。そこで、圧縮データ３００の先頭から４ＫＢのサイズまでを展開すれば、入力データ２００の前半データが含まれることになる。そして、共通領域は、第１圧縮部１５１が圧縮したデータの最後までを含む。すなわち、圧縮データ３００の先頭から第１圧縮部１５１が圧縮したデータの最後までを展開すれば前半データが取得できる。そこで、圧縮データ３００の先頭から４ＫＢのサイズのデータを読み込んだ場合に、圧縮データ３００の先頭から第１圧縮部１５１が圧縮したデータの最後までを読み込めればよい。すなわち、圧縮データ３００の先頭から第１圧縮部１５１が圧縮したデータの最後までのサイズが４ＫＢ以下に収まればよい。このことから、前半データのサイズ４ＫＢに圧縮前サイズｘ’を加算した値に暫定圧縮率ｙ’を乗算した値が４ＫＢ以下、すなわち、（４＋ｘ’）×ｙ’≦４となればよい。
【００４７】
このことから、第１圧縮部１５１は、（４＋ｘ’）×ｙ’≦４に算出した暫定圧縮率ｙ’＝ｃ／ｘ’を代入した式であるｘ’≧４ｃ’／（４−ｃ’）を、圧縮前サイズｘ’が満たすか否かを判定する。以下では、ｘ’≧４ｃ’／（４−ｃ’）を「境界判定式」という。境界判定式を満たす場合、第１圧縮部１５１は、圧縮Ｃ１の処理を継続する。
【００４８】
第１圧縮部１５１は、アンカーポインタ及びｉｐポインタをマッチしたデータの入力データ２００の後端側の隣のデータに設定する。その後、第１圧縮部１５１は、圧縮Ｃ１を入力データ２００の後端に向けて進める。そして、第１圧縮部１５１は、マッチする位置が確定する毎に、その時点での圧縮前サイズ及び圧縮後サイズを算出し、境界判定式を満たすか否かを判定する。境界判定式を満たす場合、第１圧縮部１５１は、圧縮Ｃ１を継続する。これに対して、境界判定式を満たさない場合、第１圧縮部１５１は、１つ前のマッチを確定した位置を第１圧縮位置として決定する。この場合、第１圧縮部１５１は、図８に示すように、最後のマッチする位置が確定した位置にアンカーポインタ、ｉｐポインタ及びｏｐポインタを戻す。図８は、第１圧縮部による圧縮が完了した状態を示す図である。これにより、第１圧縮部１５１は、圧縮バッファ１７の領域Ｒ１に、入力データ２００の中心位置から第１圧縮位置までを圧縮したデータを配置して圧縮Ｃ１を終了する。図８において入力データ２００のグレーアウトした領域は圧縮が完了した領域を示す。また、入力データ２００の太線で囲われた領域は共通領域となる領域を示す。
【００４９】
このように、第１圧縮部１５１は、入力データ２００の中心位置から後端に向けて圧縮Ｃ１を行う。そして、圧縮Ｃ１を終了すると、第１圧縮部１５１は、入力データ２００を第２圧縮部１５２へ出力する。
【００５０】
図１に戻って説明を続ける。第２圧縮部１５２は、入力データ２００の入力を第１圧縮部１５１から受ける。また、第２圧縮部１５２は、入力データ２００の中心位置の情報及び圧縮バッファ１７の中心位置の情報の入力を特定部１２から受ける。
【００５１】
次に、第２圧縮部１５２は、入力データ２００の中心位置にアンカーポインタ及びｉｐポインタを戻す。さらに、第２圧縮部１５２は、圧縮バッファ１７の中心位置にｏｐポインタを戻し図９の状態とする。図９は、第２圧縮部による圧縮の開始状態を表す図である。そして、第２圧縮部１５２は、入力データ２００の中心位置から先頭に向けて圧縮を開始する。
【００５２】
第２圧縮部１５２は、図１０に示すように、ｉｐポインタを入力データ２００の中心位置から先端に向けて移動させながら、ハッシュテーブル１４１を用いて圧縮Ｃ２を実行する。図１０は、第２圧縮部が同じｖａｌｕｅを有するデータを見つけた状態を表す図である。
【００５３】
第２圧縮部１５２は、図１０に示すように、ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅの有無をハッシュテーブル１４１から判定する。ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅがハッシュテーブル１４１に無ければ、第２圧縮部１５２は、ｉｐポインタが示すデータのハッシング結果に対応するｋｅｙ及びｖａｌｕｅをハッシュテーブル１４１に登録する。
【００５４】
ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅがある場合、第２圧縮部１５２は、ｉｐポインタが示すデータと同じｖａｌｕｅを有するデータにマッチポインタをセットする。ここで、ハッシュテーブル１４１には、圧縮Ｃ１において作成されたｋｅｙとｖａｌｕｅが登録済みである。そのため、第２圧縮部１５２は、圧縮対象のデータと圧縮Ｃ１で用いられたデータとの重複も圧縮に用いることができる。つまり、第２圧縮部１５２は、ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅと圧縮Ｃ１で用いられたデータとのｖａｌｕｅの一致を判定し、一致しなければ、次に圧縮Ｃ２での圧縮対象となるデータのｖａｌｕｅの一致の判定を行うことになる。
【００５５】
そして、第２圧縮部１５２は、ｖａｌｕｅが一致したデータにマッチポインタをセットする。そして、第２圧縮部１５２は、アンカーポインタからｉｐポインタ間をｌｉｔｅｒａｌとしてエンコードを開始する。第２圧縮部１５２は、ｉｐポインタからアンカーポインタまでの長さを算出する。そして、第２圧縮部１５２は、ｌｉｔｅｒａｌ長１７５をｏｐポインタの示す位置から書き込む。次に、第２圧縮部１５２は、ｌｉｔｅｒａｌ長１７５の圧縮バッファ１７の先頭側の隣に、データ２０４をｌｉｔｅｒａｌの実データ１７６として書き込む。次に、第２圧縮部１５２は、ｌｉｔｅｒａｌの実データ１７６の圧縮バッファ１７の先頭側の隣に、ｉｐポインタからマッチポインタまでの長さ２０５をｍａｔｃｈのオフセット１７７として、圧縮バッファ１７に書き込む。第２圧縮部１５２は、ｍａｔｃｈのオフセット１７７の後ろにｏｐポインタを設定する。
【００５６】
次に、第２圧縮部１５２は、マッチポインタ及びｉｐポインタをそれぞれ入力データ２００の先端に向けて移動させ、どこまでマッチするかを確認する。図１１は、第２圧縮部がマッチする位置を確定させた状態を表す図である。第２圧縮部１５２は、マッチする位置が確定すると、マッチするデータ長２０６を取得する。そして、第２圧縮部１５２は、データ長２０６を、ｍａｔｃｈのオフセット１７７の圧縮バッファ１７の先端側の隣にｍａｔｃｈ長１７８として書き込む。第２圧縮部１５２は、ｍａｔｃｈ長１７８の後ろにｏｐポインタをセットする。
【００５７】
ここで、第２圧縮部１５２は、この時点での圧縮開始位置から圧縮が完了した位置までの圧縮前サイズｘ’を取得する。さらに、第２圧縮部１５２は、その時点での圧縮後サイズｃ’を取得する。そして、第２圧縮部１５２は、取得した圧縮前サイズｘ’及び圧縮後サイズｃ’が境界判定式を満たすか否かを判定する。
【００５８】
第２圧縮部１５２は、マッチする位置が確定する毎に、その時点での圧縮前サイズ及び圧縮後サイズを算出し、境界判定式を満たすか否かを判定する。境界判定式を満たす場合、第２圧縮部１５２は、圧縮Ｃ２を継続する。これに対して、境界判定式を満たさない場合、第２圧縮部１５２は、１つ前のマッチを確定した位置を第２圧縮位置として決定する。この場合、第２圧縮部１５２は、図１２に示すように、最後のマッチする位置が確定した位置にアンカーポインタ、ｉｐポインタ及びｏｐポインタを戻す。図１２は、第２圧縮部による圧縮が完了した状態を示す図である。これにより、第２圧縮部１５２は、圧縮バッファ１７の領域Ｒ２に、入力データ２００の中心位置から第２圧縮位置までを圧縮したデータを配置して圧縮Ｃ２を終了する。
【００５９】
このように、第２圧縮部１５２は、入力データ２００の中心位置から先端に向けて圧縮Ｃ２を行う。そして、圧縮Ｃ２を終了すると、第２圧縮部１５２は、圧縮バッファ１７の領域Ｒ２の先端側の隣の２ｂｙｔｅの領域３０１に、その位置から圧縮バッファ１７の中心位置までのオフセットを格納する。この領域Ｒ２の先端の位置が「基準位置」の一例にあたり、このオフセットが、「第１相対距離」にあたる。その後、第２圧縮部１５２は、入力データ２００を個別領域圧縮部１６の第４圧縮部１６２へ出力する。ここで、図１２では、分かり易いようにオフセットを格納する領域３０１を大きく記載したが、実際にはきわめて小さい領域であるので、この後の図では領域３０１を単に線として記載する。
【００６０】
図１に戻って説明を続ける。個別領域圧縮部１６は、第３圧縮部１６１及び第４圧縮部１６２を有する。この個別領域圧縮部１６が、「後圧縮部」の一例にあたる。
【００６１】
第３圧縮部１６１は、後半データの残りの領域の圧縮を行う。また、第４圧縮部１６２は、前半データの残りの領域の圧縮を行う。以下に、第３圧縮部１６１及び第４圧縮部１６２の詳細について説明する。
【００６２】
第４圧縮部１６２は、入力データ２００の入力を第２圧縮部１５２から受ける。そして、第４圧縮部１６２は、ハッシュテーブル１４２を圧縮用情報記憶部１４に作成する。
【００６３】
図１３は、第４圧縮部による圧縮状態を表す図である。第４圧縮部１６２は、その時点でのアンカーポインタ、ｉｐポインタ及びｏｐポインタの位置から入力データ２００の先端に向けて圧縮Ｃ３を実行する。圧縮Ｃ３において、第４圧縮部１６２は、ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅの有無をハッシュテーブル１４１及びハッシュテーブル１４２から判定する。すなわち、第４圧縮部１６２は、共通部分のデータも圧縮の対象とするデータとのマッチに利用する。これにより、圧縮Ｃ３により生成された圧縮データは、圧縮Ｃ１及びＣ２により生成されたデータとともに展開することで、正しく展開することができる。
【００６４】
ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅがハッシュテーブル１４１又は１４２に無ければ、第４圧縮部１６２は、ｉｐポインタが示すデータのハッシング結果に対応するｋｅｙ及びｖａｌｕｅをハッシュテーブル１４２に登録する。ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅがある場合、第４圧縮部１６２は、マッチした場合の処理を第２圧縮部１５２と同様に行う。第４圧縮部１６２は、入力データ２００の先端まで圧縮Ｃ３を実行する。
【００６５】
このように、第４圧縮部１６２は、入力データ２００の共通領域の先端側の端部から先端に向けて圧縮Ｃ３を行う。そして、第４圧縮部１６２は、圧縮バッファ１７の領域Ｒ３に、入力データ２００の共通領域の先端側の端部から先端までのデータの圧縮データを配置して圧縮Ｃ３を終了する。圧縮Ｃ３を終了すると、第４圧縮部１６２は、入力データ２００を第３圧縮部１６１へ出力する。
【００６６】
第３圧縮部１６１は、入力データ２００の入力を第４圧縮部１６２から受ける。図１４は、第３圧縮部による圧縮の開始状態を表す図である。第３圧縮部１６１は、アンカーポインタ及びｉｐポインタを共通領域の入力データ２００の後端側の端部にセットする。また、第３圧縮部１６１は、ｏｐポインタを領域Ｒ１の圧縮バッファ１７の後端側の端部にセットする。さらに、第３圧縮部１６１は、ハッシュテーブル１４２の登録情報をクリアする。
【００６７】
第３圧縮部１６１は、アンカーポインタ、ｉｐポインタ及びｏｐポインタの位置から入力データ２００の後端に向けて圧縮Ｃ４を実行する。図１５は、第３圧縮部による圧縮の開始状態を表す図である。圧縮Ｃ４において、第３圧縮部１６１は、ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅの有無をハッシュテーブル１４１及びハッシュテーブル１４２から判定する。すなわち、第３圧縮部１６１は、共通部分のデータも圧縮の対象とするデータとのマッチに利用する。ただし、ハッシュテーブル１４２の登録情報は圧縮Ｃ４を実行する前にクリアされているので、圧縮Ｃ３で圧縮されたデータはマッチに利用されない。これにより、圧縮Ｃ４により生成された圧縮データは、圧縮Ｃ１及びＣ２により生成されたデータとともに展開することで、正しく展開することができる。
【００６８】
ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅがハッシュテーブル１４１又は１４２に無ければ、第３圧縮部１６１は、ｉｐポインタが示すデータのハッシング結果に対応するｋｅｙ及びｖａｌｕｅをハッシュテーブル１４２に登録する。ｉｐポインタが示すデータのハッシング結果に対応するｖａｌｕｅがある場合、第３圧縮部１６１は、マッチした場合の処理を第１圧縮部１５１と同様に行う。第３圧縮部１６１は、入力データ２００の後端まで圧縮Ｃ４を実行する。
【００６９】
このように、第３圧縮部１６１は、入力データ２００の共通領域の後端側の端部から後端に向けて圧縮Ｃ４を行う。そして、第３圧縮部１６１は、圧縮バッファ１７の領域Ｒ４に、入力データ２００の共通領域の後端側の端部から後端までのデータの圧縮データを配置して圧縮Ｃ４を終了する。これにより、圧縮データ３００が完成する。圧縮Ｃ４を終了すると、第４圧縮部１６２は、圧縮の終了通知を再圧縮部１８の第１再圧縮部１８１へ出力する。
【００７０】
再圧縮部１８は、第１圧縮部１５１及び第２圧縮部１５２の圧縮率の予測がはずれたか否かを判定する。そして、予測がはずれた場合に、再圧縮部１８は、再度圧縮を行う。以下に、第１再圧縮部１８１及び第２再圧縮部１８２について詳細に説明する。
【００７１】
第１再圧縮部１８１は、圧縮の終了通知の入力を第４圧縮部１６２から受ける。そして、第１再圧縮部１８１は、圧縮バッファ１７に格納された圧縮データ３００の領域Ｒ１、Ｒ２及びＲ３のそれぞれのサイズの合計が４ＫＢを超えるか否かを判定する。
【００７２】
図１６は、実施例１に係る再圧縮部による入力データの再圧縮について説明するための図である。ここでは、共通領域圧縮部１５及び個別領域圧縮部１６により入力データ２００が圧縮され圧縮データ３０２が生成されたものとする。
【００７３】
この場合、第１再圧縮部１８１は、圧縮データ３０２における領域Ｒ５のサイズが４ＫＢを超えているか否かを判定する。領域Ｒ５のサイズが４ＫＢを超えている場合、第１圧縮部１５１の圧縮率の予測がはずれたといえる。その場合、圧縮データ３０２の先端から４ＫＢを読み出して展開しても、領域Ｒ１のデータの一部が読み落とされてしまうため、正確な展開が行われない。
【００７４】
そこで、第１再圧縮部１８１は、圧縮バッファ１７に格納された圧縮データ３００を破棄する。さらに、第１再圧縮部１８１は、ハッシュテーブル１４１及び１４２の登録情報をクリアする。そして、第１再圧縮部１８１は、ハッシュテーブル１４１を用いて、入力データ２００の先端から中間位置までの圧縮Ｃ’１を行う。この場合、ハッシュテーブル１４１には他の情報は登録されていないので、第１再圧縮部１８１は、圧縮Ｃ’１の対象となるデータ間でのみマッチを確認する。次に、第１再圧縮部１８１は、入力データ２００の中間位置から後端までの圧縮Ｃ’２を行う。この場合も、ハッシュテーブル１４２には他の情報は登録されていないので、第１再圧縮部１８１は、圧縮Ｃ’２の対象となるデータ間でのみマッチを確認する。すなわち、第１再圧縮部１８１は、入力データ２００を前半データと後半データに分けて、それぞれに対して通常の圧縮を行うことになる。その後、第１再圧縮部１８１は、再圧縮の完了通知を格納処理部１９へ出力する。
【００７５】
これに対して、領域Ｒ５のサイズが４ＫＢ以下の場合、第１圧縮部１５１の圧縮率の予測は当たったといえる。その場合、第１再圧縮部１８１は、圧縮正常の通知を第２再圧縮部１８２へ出力する。
【００７６】
第２再圧縮部１８２は、圧縮正常の通知の入力を第１再圧縮部１８１から受ける。そして、第２再圧縮部１８２は、圧縮バッファ１７に格納された圧縮データ３００の領域Ｒ１、Ｒ２及びＲ４のそれぞれのサイズの合計が４ＫＢを超えるか否かを判定する。ここでは、共通領域圧縮部１５及び個別領域圧縮部１６により入力データ２００が圧縮され図１６における圧縮データ３０３が生成されたものとする。
【００７７】
この場合、第２再圧縮部１８２は、圧縮データ３０３における領域Ｒ６のサイズが４ＫＢを超えているか否かを判定する。領域Ｒ６のサイズが４ＫＢを超えている場合、第２圧縮部１５２の圧縮率の予測がはずれたといえる。その場合、領域Ｒ２先端から圧縮データ３０３の後端に向けて４ＫＢの領域を読み出して展開しても、領域Ｒ４の一部が読み落とされてしまうため、正確な展開が行われない。
【００７８】
そこで、第２再圧縮部１８２は、圧縮バッファ１７に格納された圧縮データ３００を破棄する。さらに、第２再圧縮部１８２は、ハッシュテーブル１４１及び１４２の登録情報をクリアする。そして、第２再圧縮部１８２は、第１圧縮部１５１と同様の圧縮Ｃ’１及びＣ’２を実行する。その後、第２再圧縮部１８２は、再圧縮の完了通知を格納処理部１９へ出力する。
【００７９】
これに対して、領域Ｒ６のサイズが４ＫＢ以下の場合、第１圧縮部１５１の圧縮率の予測は当たったといえる。その場合、第２再圧縮部１８２は、圧縮正常の通知を格納処理部１９へ出力する。
【００８０】
格納処理部１９は、第２再圧縮部１８２から圧縮正常の通知の入力を受けると、圧縮バッファ１７から圧縮データ３００を取得する。そして、格納処理部１９は、取得した圧縮データ３００を記憶部３０に格納する。その後、格納処理部１９は、共通領域を使用した圧縮である重畳圧縮を表す情報を、例えば、メタデータ１４３のリザーブ領域の所定の場所に格納する。また、格納処理部１９は、圧縮データ３００を格納した記憶部３０のデータ先頭セクタアドレスをメタデータ１４３の先頭アドレス格納領域３１１に格納する。さらに、格納処理部１９は、記憶部３０における圧縮データ３００における領域３０１が格納された位置の圧縮データ３００のデータ先頭セクタアドレスからのオフセットをオフセット格納領域３１２に格納する。領域３０１が格納された位置の圧縮データ３００のデータ先頭セクタアドレスからのオフセットが、「第２相対距離」にあたる。
【００８１】
また、格納処理部１９は、第１再圧縮部１８１又は第２再圧縮部１８２から再圧縮完了の通知の入力を受けると、圧縮バッファ１７から圧縮データ３００を取得する。そして、格納処理部１９は、取得した圧縮データ３００を記憶部３０に格納する。その後、格納処理部１９は、入力データ２００を前半データと後半データに分割して圧縮した分割圧縮を表す情報を、例えば、メタデータ１４３のリザーブ領域の所定の場所に格納する。また、格納処理部１９は、圧縮データ３００を格納した記憶部３０のデータ先頭セクタアドレスをメタデータ１４３の先頭アドレス格納領域３１１に格納する。さらに、格納処理部１９は、記憶部３０における圧縮データ３００の中心位置の圧縮データ３００のデータ先頭セクタアドレスからのオフセットをオフセット格納領域３１２に格納する。
【００８２】
読出部２０は、４ＫＢのデータの読み出し命令の入力を送受信部１１から受ける。そして、読出部２０は、指定された４ＫＢのデータを管理するメタデータ１４３を参照する。次に、読出部２０は、指定された４ＫＢのデータの圧縮方法をメタデータ１４３から取得する。
【００８３】
圧縮方法が重畳圧縮の場合、読出部２０は、データ先頭セクタアドレス及びオフセットをメタデータ１４３の先頭アドレス格納領域３１１及びオフセット格納領域３１２から取得する。次に、読出部２０は、指定された４ＫＢのデータがメタデータ１４３により管理される８ＫＢのデータの前半データか後半データかを判定する。
【００８４】
指定された４ＫＢのデータが前半データの場合、読出部２０は、取得したデータ先頭セクタアドレスを用いて、図１７に示すように、メタデータ１４３により管理される８ＫＢのデータの圧縮データ３００における先端から４ＫＢ分を記憶部３０から読み出す。図１７は、前半データの展開を説明するための図である。ここで、図１７では、領域Ｒ１，Ｒ２及びＲ３を繋いだデータがちょうど４ＫＢのデータになる場合を図示しているが、実際には、領域Ｒ１，Ｒ２及びＲ３を繋いだデータは４ＫＢのデータより小さくてもよい。その場合、読出部２０は、先端から４ＫＢのデータとなるようにＲ１の後ろの余剰データも記憶部３０から読み出す。
【００８５】
次に、読出部２０は、オフセットを用いて、読み出した圧縮されたデータの領域３０１を特定する。次に、読出部２０は、特定した領域３０１から中心位置までのオフセットを取得する。次に、読出部２０は、領域Ｒ２の先頭に対して取得した中心位置までのオフセットを加えて中心位置３１０を特定する。
【００８６】
そして、読出部２０は、中心位置３１０から領域Ｒ１の後端に向かってデータを読み出しながら展開Ｅ１を実行する。展開Ｅ１が完了すると、読出部２０は、中心位置３１０から領域Ｒ２の先端に向かって展開Ｅ２を実行する。このとき、読出部２０は、既に完了しした展開Ｅ１により作成された領域Ｒ１を展開したデータも展開Ｅ２に利用する。その後、展開Ｅ２が完了すると、読出部２０は、領域Ｒ２の先端から領域Ｒ３の先端に向かって展開Ｅ３を実行する。このとき、読出部２０は、既に完了しした展開Ｅ１により作成された領域Ｒ１を展開したデータ及び展開Ｅ２により作成された領域Ｒ２を展開したデータも展開Ｅ３に利用する。これにより、読出部２０は、展開後データ３２１を取得する。
【００８７】
次に、読出部２０は、展開後データ３２１の先端から４ＫＢのデータを読み出してデータＲＤ２１を取得する。このデータＲＤ２１が、読み出し命令により指定されたデータにあたる。また、これ以外にも、領域Ｒ２と領域Ｒ１との境界は、Ｉｎｉｔｉａｌ長が連続するので、読出部２０は、Ｉｎｉｔｉａｌ長が連続する位置までデータを展開して取得することで、読み出し命令により指定されたデータＲＤ２１を取得することができる。
【００８８】
これに対して、指定された４ＫＢのデータが後半データの場合、読出部２０は、取得したデータ先頭セクタアドレスに取得したオフセットを加えて領域３０１の位置を特定する。次に、読出部２０は、図１８に示すように、メタデータ１４３により管理される８ＫＢのデータの圧縮データ３００の領域３０１の位置の後端から４ＫＢ分を記憶部３０から読み出す。図１８は、後半データの展開を説明するための図である。ここで、図１８では、領域Ｒ１，Ｒ２及びＲ３を繋いだデータがちょうど４ＫＢのデータになる場合を図示しているが、実際には、領域Ｒ１，Ｒ２及びＲ３を繋いだデータは４ＫＢのデータより小さくてもよい。その場合、読出部２０は、領域３０１の位置の後端から圧縮データ３００の後端までの４ＫＢより小さいデータを記憶部３０から読み出す。
【００８９】
次に、読出部２０は、オフセットを用いて、読み出した圧縮されたデータの先端に対して領域３０１に格納された中心位置までのオフセットを加えて中心位置３１０を特定する。そして、読出部２０は、中心位置３１０から領域Ｒ１の後端に向かってデータを読み出しながら展開Ｅ’１を実行する。展開Ｅ’１が完了すると、読出部２０は、中心位置３１０から領域Ｒ２の先端に向かって展開Ｅ’２を実行する。このとき、読出部２０は、既に完了しした展開Ｅ’１により作成された領域Ｒ１を展開したデータも展開Ｅ’２に利用する。その後、展開Ｅ’２が完了すると、読出部２０は、領域Ｒ２の先端から領域Ｒ３の先端に向かって展開Ｅ’３を実行する。このとき、読出部２０は、既に完了しした展開Ｅ’１により作成された領域Ｒ１を展開したデータ及び展開Ｅ’２により作成された領域Ｒ２を展開したデータも展開Ｅ’３に利用する。これにより、読出部２０は、展開後のデータ３２２を取得する。
【００９０】
次に、読出部２０は、展開後のデータ３２２の後端から４ＫＢのデータを読み出してデータＲＤ２２を取得する。このデータＲＤ２２が、読み出し命令により指定されたデータにあたる。また、この場合も、読出部２０は、Ｉｎｉｔｉａｌ長が連続する位置までデータを展開して取得することで、読み出し命令により指定されたデータＲＤ２２を取得することができる。
【００９１】
一方、圧縮方法が分割圧縮の場合、読出部２０は、データ先頭セクタアドレス及び中心位置の圧縮データ３００のデータ先頭セクタアドレスからのオフセットをメタデータ１４３の先頭アドレス格納領域３１１及びオフセット格納領域３１２から取得する。次に、読出部２０は、指定された４ＫＢのデータがメタデータ１４３により管理される８ＫＢのデータの前半データか後半データかを判定する。
【００９２】
そして、指定された４ＫＢのデータが前半データの場合、読出部２０は、圧縮データ３００の先端から中心位置までのデータを読み出し展開を行う。また、指定された４ＫＢのデータが後半データの場合、読出部２０は、中心位置から圧縮データ３００の後端までのデータを読み出し展開を行う。これにより、読出部２０は、読み出し命令により指定されたデータを取得する。
【００９３】
その後、読出部２０は、取得した展開済みのデータを、データの読み出し命令の応答として送受信部１１へ出力する。このように、読出部２０は、データの読み出しを行う場合、前半データ又は後半データのいずれの読み出しであっても、共通領域を含むデータを読み出して展開することで、指定されたデータを取得することができる。この読出部２０が、「展開部」の一例にあたる。
【００９４】
次に、図１９を参照して、本実施例に係るＡＦＡ１によるデータの重畳圧縮の処理の流れについて説明する。図１９は、実施例１に係るＡＦＡによるデータの重畳圧縮の処理のフローチャートである。
【００９５】
送受信部１１は、データの格納命令とともに入力データ２００をサーバ２から受信する。そして、送受信部１１は、入力データ２００のサイズを特定部１２へ出力する。さらに、送受信部１１は、入力データ２００を第１圧縮部１５１へ出力する。特定部１２は、入力データ２００のサイズを送受信部１１から取得する。また、特定部１２は、圧縮バッファ１７のサイズを圧縮バッファ割当部１３から取得する（ステップＳ１）。
【００９６】
次に、特定部１２は、入力データ２００の中心位置を計算する（ステップＳ２）。そして、特定部１２は、入力データ２００の中心位置の情報を第１圧縮部１５１へ出力する。
【００９７】
第１圧縮部１５１は、入力データ２００の入力を送受信部１１から受ける。また、第１圧縮部１５１は、入力データ２００の中心位置の情報の入力を特定部１２から受ける。そして、第１圧縮部１５１は、入力データ２００の中心位置にアンカーポインタ及びｉｐポインタをセットする（ステップＳ３）。
【００９８】
次に、特定部１２は、圧縮バッファ１７の中心位置３１０を計算する（ステップＳ４）。そして、特定部１２は、圧縮バッファ１７の中心位置３１０の情報を第１圧縮部１５１へ出力する。
【００９９】
第１圧縮部１５１は、圧縮バッファ１７の中心位置３１０の情報の入力を特定部１２から受ける。そして、第１圧縮部１５１は、圧縮バッファ１７の中心位置３１０にоｐポインタをセットする（ステップＳ５）。
【０１００】
次に、第１圧縮部１５１は、ハッシュテーブル１４１を圧縮用情報記憶部１４に作成する。また、第４圧縮部１６２は、ハッシュテーブル１４２を圧縮用情報記憶部１４に作成する（ステップＳ６）。
【０１０１】
次に、第１圧縮部１５１は、ハッシュテーブル１４１を使用して圧縮Ｃ１を実行する（ステップＳ７）。そして、第１圧縮部１５１は、アンカーポインタ及びｉｐポインタが配置された入力データ２００を第２圧縮部１５２へ出力する。
【０１０２】
次に、第２圧縮部１５２は、ハッシュテーブル１４１を使用して圧縮Ｃ２を実行する（ステップＳ８）。そして、第２圧縮部１５２は、アンカーポインタ及びｉｐポインタが配置された入力データ２００を第４圧縮部１６２へ出力する。
【０１０３】
さらに、第２圧縮部１５２は、圧縮済みのデータの先端から圧縮バッファ１７の中心位置３１０までのオフセットを圧縮済みのデータの先頭の領域３０１に記録する（ステップＳ９）。
【０１０４】
次に、第４圧縮部１６２は、ハッシュテーブル１４１及び１４２を使用して圧縮Ｃ３を実行する（ステップＳ１０）。そして、第４圧縮部１６２は、アンカーポインタ及びｉｐポインタが配置された入力データ２００を第３圧縮部１６１へ出力する。
【０１０５】
次に、第３圧縮部１６１は、ハッシュテーブル１４１及び１４２を使用して圧縮Ｃ４を実行する（ステップＳ１１）。そして、第３圧縮部１６１は、圧縮の完了通知を再圧縮部１８へ出力する。
【０１０６】
次に、再圧縮部１８は、領域Ｒ１，Ｒ２及びＲ３のサイズの合計が４ＫＢを超えるか否かを判定する（ステップＳ１２）。領域Ｒ１，Ｒ２及びＲ３のサイズの合計が４ＫＢを超えない場合（ステップＳ１２：否定）、再圧縮部１８は、領域Ｒ１，Ｒ２及びＲ４のサイズの合計が４ＫＢを超えるか否かを判定する（ステップＳ１３）。
【０１０７】
領域Ｒ１，Ｒ２及びＲ４のサイズの合計が４ＫＢを超えない場合（ステップＳ１３：否定）、再圧縮部１８は、圧縮正常の通知を格納処理部１９へ出力する。格納処理部１９は、圧縮バッファ１７に存在する圧縮データ３００を記憶部３０へ格納し、データ先頭セクタアドレス及び中心位置の情報を格納した領域３０１のオフセットをメタデータ１４３に格納する（ステップＳ１４）。
【０１０８】
領域Ｒ１，Ｒ２及びＲ３のサイズの合計が４ＫＢを超えた場合（ステップＳ１２：肯定）及び領域Ｒ１，Ｒ２及びＲ４のサイズの合計が４ＫＢを超えた場合（ステップＳ１３：肯定）、再圧縮部１８は、圧縮バッファ１７から圧縮データ３００を削除する。さらに、再圧縮部１８は、入力データ２００を４ＫＢの前半データ及び後半データに分割しそれぞれを圧縮する分割圧縮を実行する（ステップＳ１５）。その後、再圧縮部１８は、再圧縮完了の通知を格納処理部１９へ出力する。
【０１０９】
格納処理部１９は、圧縮バッファ１７に存在する分割圧縮されたデータを記憶部３０へ格納し、データ先頭セクタアドレス及び中心位置のオフセットをメタデータ１４３に格納する（ステップＳ１６）。
【０１１０】
図２０は、各圧縮方法を用いた場合の読み出し時のＩＯＰＳ及び圧縮率の比較を表す図である。８ＫＢの入力データ２００のデータ全体を圧縮する全体圧縮の場合、４ＫＢのデータの読み出し時のＩＯＰＳは、２８５Ｋとなる。これに対して、入力データ２００を４ＫＢの前半データ及び後半データに分割して圧縮する分割圧縮の場合、４ＫＢのデータの読み出し時のＩＯＰＳは、４６０Ｋとなる。そして、共通領域を用いて圧縮する重畳圧縮の場合、４ＫＢのデータの読み出し時のＩＯＰＳは、４６０Ｋとなる。
【０１１１】
また、全体圧縮の場合には圧縮率は良好であるが、分割圧縮の場合には圧縮率は悪い。これに対して、重畳圧縮の場合、全体圧縮と分割圧縮との間の圧縮率となり、ある程度良好な圧縮率である。このように、重畳圧縮の場合、読み出し時のＩＯＰＳを全体圧縮の場合に比べて改善できるとともに、圧縮率を分割圧縮の場合に比べて改善できる。
【０１１２】
以上に説明したように、本実施例に係るＡＦＡは、圧縮データの先端又は後端からの４ＫＢのデータを展開した時に前半又は後半データを含むように、共通領域を用いて入力データを圧縮する。これにより、入力データの半分よりも多くのデータを用いて圧縮を行うので、圧縮率が向上する。また、圧縮データの先端又は後端からの４ＫＢのデータを展開することで前半又は後半のデータを取得することができ、余分なデータの読み出しを削減できるので、読み出し時のＩＯＰＳを向上させることができる。すなわち、本実施例に係るＡＦＡは、処理性能及び圧縮率の向上に寄与することができる。
【０１１３】
（変形例）
次に、実施例１の変形例について説明する。本変形例に係るＡＦＡ１は、実施例１と各領域の圧縮の順番が異なる。図２１は、実施例１の変形例における圧縮の順番を説明するための図である。
【０１１４】
例えば、例４０１に示すように、第１圧縮部１５１は、中心位置から状態４０１は、ハッシュテーブル１４１を用いて、入力データ２００の中心位置から先端に向かって圧縮Ｃ０１を実行する。次に、第２圧縮部１５２は、同じハッシュテーブル１４１を用いて、入力データ２００の中心位置から後端に向かって圧縮Ｃ０２を実行する。第４圧縮部１６２及び第３圧縮部１６１は、実施例１と同様に、それぞれ圧縮Ｃ３及び圧縮Ｃ４を実行する。このように、共通領域における圧縮Ｃ１及びＣ２の順番を入れ替えても、ＡＦＡ１は、重複圧縮を実行することができる。
【０１１５】
また、例４０２に示すように、第１圧縮部１５１及び第２圧縮部１５２は、実施例１と同様に、それぞれ圧縮Ｃ１及びＣ２を実行する。そして、第４圧縮部１６２は、ハッシュテーブル１４１及び１４２を用いて、共通領域の後端から入力データ２００の後端までのデータに対して圧縮Ｃ０３を実行する。また、第３圧縮部１６１は、共通領域の先端から入力データ２００の先端までのデータに対して圧縮Ｃ０４を実行する。このように、個別領域における圧縮Ｃ３及びＣ４の順番を入れ替えても、ＡＦＡ１は、重複圧縮を実行することができる。
【０１１６】
また、例４０３に示すように、第１圧縮部１５１は、中心位置から状態４０１は、ハッシュテーブル１４１を用いて、入力データ２００の中心位置から先端に向かって圧縮Ｃ０１を実行する。次に、第２圧縮部１５２は、同じハッシュテーブル１４１を用いて、入力データ２００の中心位置から後端に向かって圧縮Ｃ０２を実行する。そして、第４圧縮部１６２は、ハッシュテーブル１４１及び１４２を用いて、共通領域の後端から入力データ２００の後端までのデータに対して圧縮Ｃ０３を実行する。また、第３圧縮部１６１は、共通領域の先端から入力データ２００の先端までのデータに対して圧縮Ｃ０４を実行する。このように、共通領域における圧縮Ｃ１及びＣ２の順番を入れ替え、さらに、個別領域における圧縮Ｃ３及びＣ４の順番を入れ替えても、ＡＦＡ１は、重複圧縮を実行することができる。
【０１１７】
以上に説明したように、ＡＦＡは、中心位置を含む共通領域を先に圧縮し、その後、共通領域のデータも利用して個別領域の圧縮を行えば、どのような順番でも重畳圧縮を行うことができる。したがって、ＡＦＡは、共通領域と個別領域との圧縮順序を守れば、他の圧縮順序に関わらず処理性能及び圧縮率の向上に寄与することができる。
【実施例２】
【０１１８】
次に、実施例２について説明する。本実施例に係るＡＦＡは、再圧縮時に既に実施した圧縮を利用することが実施例１と異なる。本実施例に係るＡＦＡも図１のブロック図で表される。以下の説明では、実施例１と同様の各部の動作については説明を省略する。
【０１１９】
第１圧縮部１５１は、圧縮Ｃ１を実行するにあたり、ハッシュテーブル１４１１を作成する。そして、第１圧縮部１５１は、ハッシュテーブル１４１１を用いて圧縮Ｃ１を実行し、圧縮データ３００の領域Ｒ１を生成する。
【０１２０】
第２圧縮部１５２は、圧縮Ｃ２を実行するにあたり、ハッシュテーブル１４１２を作成する。そして、第２圧縮部１５２は、ハッシュテーブル１４１１及び１４１２を用いて圧縮Ｃ２を実行し、圧縮データ３００の領域Ｒ２を生成する。すなわち、本実施例では、第２圧縮部１５２は、第１圧縮部１５１が用いるハッシュテーブル１４１１とは異なるハッシュテーブル１４１２を新たに作成して圧縮Ｃ２を実行する。
【０１２１】
第４圧縮部１６２及び第３圧縮部１６１は、ハッシュテーブル１４１１，１４１２及び１４２を用いてそれぞれ圧縮Ｃ３及びＣ４を実行する。ここで、第１圧縮部１５１、第２圧縮部１５２、第３圧縮部１６１及び第４圧縮部１６２は、図２２に示すように入力データ２００に対して、圧縮Ｃ１〜Ｃ４を実行して、圧縮データ３００を生成する。図２２は、実施例２における前半データの再圧縮について説明するための図である。
【０１２２】
第１再圧縮部１８１は、領域Ｒ１，Ｒ２及びＲ３を合計した領域Ｒ５のサイズが４ＫＢより大きいか否かを判定する。領域Ｒ１，Ｒ２及びＲ３を合計した領域Ｒ５のサイズが４ＫＢより大きい場合、第１再圧縮部１８１は、圧縮データ３００の領域Ｒ１以外を破棄する。また、第１再圧縮部１８１は、ハッシュテーブル１４２の登録情報をクリアする。
【０１２３】
そして、第１再圧縮部１８１は、ハッシュテーブル１４２を用いて入力データ２００の前半の４ＫＢのデータである前半データの圧縮Ｃ’２を実行する。この場合、第１再圧縮部１８１は、前半データのみを用いて圧縮Ｃ’２を実行する。
【０１２４】
次に、第１再圧縮部１８１は、ハッシュテーブル１４２の登録内容をクリアする。そして、第１再圧縮部１８１は、ハッシュテーブル１４２及び１４１１を用いて、位置２３１から入力データ２００の後端までのデータの圧縮Ｃ’３を実行する。この場合、第１再圧縮部１８１は、圧縮Ｃ１で用いたデータも用いて圧縮Ｃ’３を実行する。
【０１２５】
このように、第１再圧縮部１８１は、領域Ｒ１の圧縮を省略して、入力データ２００の再圧縮を実行することができる。
【０１２６】
第１再圧縮部１８１から圧縮正常の通知を受けると、第２再圧縮部１８２は、図２３における領域Ｒ１，Ｒ２及びＲ４を合計した領域Ｒ６のサイズが４ＫＢより大きいか否かを判定する。図２３は、実施例２における後半データの再圧縮について説明するための図である。領域Ｒ１，Ｒ２及びＲ４を合計した領域Ｒ６のサイズが４ＫＢより大きい場合、第２再圧縮部１８２は、圧縮データ３００の領域Ｒ４を破棄する。また、第２再圧縮部１８２は、ハッシュテーブル１４２の登録情報をクリアする。
【０１２７】
そして、第２再圧縮部１８２は、ハッシュテーブル１４２及び１４１１を用いて位置２３２から入力データ２００の後端までのデータの圧縮Ｃ’４を実行する。この場合、第２再圧縮部１８２は、圧縮Ｃ１で用いたデータも用いて圧縮Ｃ’４を実行する。
【０１２８】
このように、第２再圧縮部１８２は、領域Ｒ１〜Ｒ３の圧縮を省略して、入力データ２００の再圧縮を実行することができる。
【０１２９】
次に、図２４を参照して、本実施例に係る再圧縮の処理の流れについて説明する。図２４は、実施例２に係る再圧縮の処理のフローチャートである。
【０１３０】
第１再圧縮部１８１は、領域Ｒ５のサイズが４ＫＢより大きいか否かを判定する（ステップＳ２１）。領域Ｒ５のサイズが４ＫＢより大きい場合（ステップＳ２１：肯定）、第１再圧縮部１８１は、圧縮データ３００の領域Ｒ２〜Ｒ４を破棄する（ステップＳ２２）。また、第１再圧縮部１８１は、ハッシュテーブル１４２の登録情報をクリアする。
【０１３１】
そして、第１再圧縮部１８１は、ハッシュテーブル１４２を用いて圧縮Ｃ’２を実行する（ステップＳ２３）。
【０１３２】
次に、第１再圧縮部１８１は、ハッシュテーブル１４２の登録内容をクリアする。そして、第１再圧縮部１８１は、ハッシュテーブル１４２及び１４１１を用いて圧縮Ｃ’３を実行する（ステップＳ２４）。その後、第１再圧縮部１８１は、再圧縮完了の通知を格納処理部１９へ出力し、再圧縮処理を終了する。
【０１３３】
一方、領域Ｒ５のサイズが４ＫＢ以下の場合（ステップＳ２１：否定）、第１再圧縮部１８１は、圧縮正常の通知を第２再圧縮部１８２へ出力する。第１再圧縮部１８１から圧縮正常の通知を受けると、第２再圧縮部１８２は、領域Ｒ６のサイズが４ＫＢより大きいか否かを判定する（ステップＳ２５）。領域Ｒ６のサイズが４ＫＢ以下の場合（ステップＳ２５：否定）、第２再圧縮部１８２は、圧縮正常の通知を格納処理部１９へ出力し、再圧縮処理を終了する。
【０１３４】
これに対して、領域Ｒ６のサイズが４ＫＢより大きい場合（ステップＳ２５：肯定）、第２再圧縮部１８２は、圧縮データ３００の領域Ｒ４を破棄する。また、第２再圧縮部１８２は、ハッシュテーブル１４２の登録情報をクリアする（ステップＳ２６）。
【０１３５】
そして、第２再圧縮部１８２は、ハッシュテーブル１４２，１４１１及び１４１２を用いて圧縮Ｃ’４を実行する（ステップＳ２７）。
【０１３６】
以上に説明したように、本実施例に係るＡＦＡは、再圧縮時の圧縮処理を軽減することができる。したがって、本実施例に係るＡＦＡは、処理性能をより向上させることができる。
【実施例３】
【０１３７】
次に、実施例３について説明する。本実施例に係るＡＦＡは、展開時に既に実施した圧縮を利用することが実施例１と異なる。本実施例に係るＡＦＡも図１のブロック図で表される。以下の説明では、実施例１と同様の各部の動作については説明を省略する。
【０１３８】
図２５は、実施例３に係るＡＦＡによる圧縮処理の概要を説明するための図である。本実施例では、入力データ２００が、図２５に示すように、データ＃１〜＃４を有する場合で説明する。データ＃１及び＃２は、４ＫＢの前半データを形成する。また、データ＃３及び＃４は、４ＫＢの後半データを形成する。
【０１３９】
第１圧縮部１５１は、入力データ２００のデータ＃１とデータ＃２とを入れ替える。また、第１圧縮部１５１は、入力データ２００のデータ＃３とデータ＃４とを入れ替える。これにより、第１圧縮部１５１は、データ２１０を生成する。そして、第１圧縮部１５１は、メタデータ１４３の例えばリザーブ領域の所定領域にデータの入れ替えの情報を書き込む。
【０１４０】
その後、第１圧縮部１５１、第２圧縮部１５２、第３圧縮部１６１及び第４圧縮部１６２は、データ２１０に対してそれぞれ圧縮Ｃ１〜Ｃ４を実行し、圧縮データ３００を生成する。
【０１４１】
読出部２０は、圧縮データ３００を展開してデータ２１０を生成した後にメタデータ１４３からデータの入れ替えの情報を取得する。そして、読出部２０は、データの入れ替え情報にしたがってデータ２１０の入れ替えを行って入力データ２００を生成する。
【０１４２】
以上に説明したように、本実施例に係るＡＦＡは、入力されたデータを入れ替えたデータを作成し、作成したデータに対して重畳圧縮を施してＳＳＤに保存する。このように、本実施例に係るＡＦＡは、入力されたデータを入れ替えても重畳圧縮を実行することができる。これにより、例えば、共通データを多く含む部分を共通領域に移動させることで、圧縮率を向上させることができる。
【０１４３】
ここで、本実施例では、前半データ及び後半データの前後を入れ替えた場合で説明したが、データの入れ替えはこれに限らない。第１圧縮部１５１は、入力データが復元可能なデータの入れ替えの情報をメタデータに格納すれば、どのようなデータの入れ替えを実行してもよい。
【実施例４】
【０１４４】
図２６は、実施例４に係るＡＦＡのブロック図である。本実施例に係るＡＦＡ１は、入力データ２００を３つの領域に分けて取り扱うことが実施例１と異なる。図２６において、図１と同様の符号を有する各部は特に説明のない限り同様の機能を有する。以下の説明では、実施例１と同様の各部の動作については説明を省略する。本実施例では、メタデータ１４３により管理される入力データ２００が１２ＫＢであり、ＡＦＡ１がその入力データ２００を４ＫＢのデータとして３分割したデータのそれぞれを個別に読み出せるように圧縮を行う場合で説明する。この４ＫＢが「所定サイズ」の一例にあたる。
【０１４５】
特定部１２は、図２７に示す、入力データ２００を３分割した場合の区分位置２２１及び２２２を特定する。また、特定部１２は、圧縮バッファ１７の中心位置から２ＫＢのサイズとなる両隣の位置３３１及び３３２を特定する。ここで、図２７は、実施例４に係るＡＦＡによる共通領域の圧縮について説明するための図である。
【０１４６】
共通領域圧縮部１５は、区分位置２２１及び２２２、並びに、位置３３１及び３３２の入力を受ける。共通領域圧縮部１５は、入力データ２００の入力を送受信部１１から受ける。次に、共通領域圧縮部１５は、ハッシュテーブル１４１及び１４２を圧縮用情報記憶部１４に生成する。
【０１４７】
次に、共通領域圧縮部１５は、ハッシュテーブル１４１を用いて、区分位置２２１から入力データ２００の後端に向けて圧縮Ｃ＃１を開始する。そして、共通領域圧縮部１５は、入力データ２００の先頭から圧縮位置２２３までのデータの圧縮後のサイズが４ＫＢとなる圧縮位置２２３を、ｘ’≧４ｃ’／（４−ｃ’）と表される境界判定式を用いて予測する。そして、共通領域圧縮部１５は、予測した圧縮位置２２３まで圧縮Ｃ＃１を実行する。共通領域圧縮部１５は、圧縮Ｃ＃１により、圧縮バッファ１７の領域Ｒ＃１に圧縮したデータを格納する。
【０１４８】
次に、共通領域圧縮部１５は、圧縮Ｃ＃１におけるｋｅｙ及びｖａｌｕｅが登録されたハッシュテーブル１４１を用いて、区分位置２２１から入力データ２００の先端に向けて圧縮Ｃ＃２を開始する。そして、共通領域圧縮部１５は、圧縮位置２２４から圧縮位置２２５までのデータの圧縮後のサイズが４ＫＢとなる圧縮位置２２４を、ｘ’≧４ｃ’／（４−ｃ’）と表される境界判定式を用いて予測する。そして、共通領域圧縮部１５は、予測した圧縮位置２２４まで圧縮Ｃ＃２を実行する。共通領域圧縮部１５は、圧縮Ｃ＃２により圧縮バッファ１７の領域Ｒ＃２に圧縮したデータを格納する。
【０１４９】
その後、共通領域圧縮部１５は、領域Ｒ＃２の先頭に、その位置から位置３３１までのオフセットを格納する。
【０１５０】
次に、共通領域圧縮部１５は、ハッシュテーブル１４２を用いて、区分位置２２２から入力データ２００の後端に向けて圧縮Ｃ＃３を開始する。そして、共通領域圧縮部１５は、圧縮位置２２４から圧縮位置２２５までのデータの圧縮後のサイズが４ＫＢとなる圧縮位置２２５を、ｘ’≧４ｃ’／（４−ｃ’）と表される境界判定式を用いて予測する。そして、共通領域圧縮部１５は、予測した圧縮位置２２５まで圧縮Ｃ＃３を実行する。共通領域圧縮部１５は、圧縮Ｃ＃３により、圧縮バッファ１７の領域Ｒ＃３に圧縮したデータを格納する。
【０１５１】
次に、共通領域圧縮部１５は、圧縮Ｃ＃３におけるｋｅｙ及びｖａｌｕｅが登録されたハッシュテーブル１４２を用いて、区分位置２２２から入力データ２００の先端に向けて圧縮Ｃ＃４を開始する。そして、共通領域圧縮部１５は、圧縮位置２２６から入力データ２００の後端までのデータの圧縮後のサイズが４ＫＢとなる圧縮位置２２６を、ｘ’≧４ｃ’／（４−ｃ’）と表される境界判定式を用いて予測する。そして、共通領域圧縮部１５は、予測した圧縮位置２２６まで圧縮Ｃ＃４を実行する。共通領域圧縮部１５は、圧縮Ｃ＃４により圧縮バッファ１７の領域Ｒ＃４に圧縮したデータを格納する。
【０１５２】
その後、共通領域圧縮部１５は、領域Ｒ＃４の先頭に、その位置から位置３３１までのオフセットを格納する。その後、共通領域圧縮部１５は、入力データ２００を個別領域圧縮部１６へ出力する。
【０１５３】
個別領域圧縮部１６は、入力データ２００の入力を共通領域圧縮部１５から受けると、ハッシュテーブル１４４を作成する。
【０１５４】
次に、個別領域圧縮部１６は、図２８に示すように、ハッシュテーブル１４１及び１４４を用いて、圧縮位置２２４から入力データ２００の先端までのデータの圧縮Ｃ＃５を実行する。図２８は、実施例４に係るＡＦＡによる個別領域の圧縮について説明するための図である。個別領域圧縮部１６は、圧縮Ｃ＃５により圧縮バッファ１７の領域Ｒ＃５に圧縮したデータを格納する。
【０１５５】
次に、個別領域圧縮部１６は、ハッシュテーブル１４４の登録情報をクリアする。そして、個別領域圧縮部１６は、ハッシュテーブル１４２及び１４４を用いて、圧縮位置２２５から入力データ２００の後端までのデータの圧縮Ｃ＃６を実行する。個別領域圧縮部１６は、圧縮Ｃ＃６により圧縮バッファ１７の領域Ｒ＃６に圧縮したデータを格納する。
【０１５６】
次に、個別領域圧縮部１６は、ハッシュテーブル１４４の登録情報をクリアする。そして、個別領域圧縮部１６は、ハッシュテーブル１４１，１４２及び１４４を用いて、圧縮位置２２３から圧縮位置２２６までのデータの圧縮Ｃ＃７を実行する。個別領域圧縮部１６は、圧縮Ｃ＃７により圧縮バッファ１７の領域Ｒ＃７に圧縮したデータを格納する。これにより、個別領域圧縮部１６は、圧縮データ３００を生成する。その後、個別領域圧縮部１６は、圧縮の完了を再圧縮部１８へ通知する。
【０１５７】
再圧縮部１８は、領域Ｒ＃１，Ｒ＃２及びＲ＃５の連結領域、領域Ｒ＃１，Ｒ＃４及びＲ＃７の連結領域、又は、領域Ｒ＃３，Ｒ＃４及びＲ＃６の連結領域のサイズの合計が４ＫＢを超えるか否かを判定する。４ＫＢを超える連結領域がある場合、再圧縮部１８は、分割圧縮による再圧縮を実行する。その後、再圧縮部１８は、再圧縮の完了を格納処理部１９へ通知する。また、４ＫＢを超える連結領域が無い場合、再圧縮部１８は、圧縮正常の通知を格納処理部１９へ通知する。
【０１５８】
格納処理部１９は、圧縮正常の通知を再圧縮部１８から受けた場合、圧縮バッファ１７から圧縮データ３００を取得する。そして、格納処理部１９は、取得した圧縮データ３００を記憶部３０に格納する。その後、格納処理部１９は、共通領域を使用した圧縮である重畳圧縮を表す情報を、例えば、メタデータ１４３のリザーブ領域の所定の場所に格納する。
【０１５９】
また、格納処理部１９は、圧縮データ３００を格納した記憶部３０のデータ先頭セクタアドレスを、図２９に示すようにメタデータ１４３の先頭アドレス格納領域３１１に格納する。図２９は、実施例４に係るメタデータの一例を表す図である。次に、格納処理部１９は、領域Ｒ＃２の先頭から位置３３１までのオフセットが格納された領域の圧縮データ３００のデータ先頭セクタアドレスからのオフセットをオフセット格納領域３１２に格納する。さらに、格納処理部１９は、領域Ｒ＃２の先頭から位置３３１までのオフセットが格納された領域の圧縮データ３００のデータ先頭セクタアドレスからのオフセットをオフセット格納領域３１３に格納する。
【０１６０】
また、格納処理部１９は、再圧縮部１８から再圧縮完了の通知の入力を受けると、圧縮バッファ１７から圧縮データ３００を取得する。そして、格納処理部１９は、取得した圧縮データ３００を記憶部３０に格納する。その後、格納処理部１９は、入力データ２００を分割圧縮を表す情報を、例えば、メタデータ１４３のリザーブ領域の所定の場所に格納する。また、格納処理部１９は、圧縮データ３００を格納した記憶部３０のデータ先頭セクタアドレスをメタデータ１４３の先頭アドレス格納領域３１１に格納する。さらに、格納処理部１９は、位置３３１及び３３２のデータ先頭セクタアドレスからのオフセットをオフセット格納領域３１２及び３１３に格納する。
【０１６１】
読出部２０は、重畳圧縮が行われたデータを展開する場合、メタデータ１４３を参照することで、圧縮データ３００の先端の位置、領域Ｒ＃１及びＲ＃３の後端の位置、領域Ｒ＃２及びＲ＃４の先端の位置、並びに、位置３３１及び３３２を特定する。そして、読出部２０は、例えば、圧縮データ３００のうちの領域Ｒ＃１，Ｒ＃２及びＲ＃５を読み出して、領域Ｒ＃１，Ｒ＃２及びＲ＃５の順に展開し、先端から４ＫＢのデータを取得することで、入力データ２００の３分割した場合の先端側のデータを取得する。また、読出部２０は、例えば、圧縮データ３００のうちの領域Ｒ＃１〜Ｒ＃４及びＲ＃７を読み出して、領域Ｒ＃１〜Ｒ＃４及びＲ＃７の順に展開し、先端から４ＫＢのデータを取得することで、入力データ２００の３分割した場合の中央のデータを取得する。また、読出部２０は、例えば、圧縮データ３００のうちの領域Ｒ＃３，Ｒ＃４及びＲ＃７を読み出して、領域Ｒ＃３，Ｒ＃４及びＲ＃７の順に展開し、先端から４ＫＢのデータを取得することで、入力データ２００の３分割した場合の後端側のデータを取得する。
【０１６２】
以上に説明したように、本実施例に係るＡＦＡは、圧縮データから４ＫＢの領域を展開した時に入力データを３分割することで生成されるデータが含まれるように、共通領域を用いて入力データを圧縮する。これにより、入力データの内の４ＫＢ分のデータよりも多くのデータを用いて圧縮を行うので、圧縮率が向上する。また、圧縮データの内の所定の４ＫＢのデータを展開することで入力データを３分割することで生成されるデータを取得することができ、余分なデータの読み出しを削減できるので、読み出し時のＩＯＰＳを向上させることができる。すなわち、本実施例に係るＡＦＡは、処理性能及び圧縮率の向上に寄与することができる。
【０１６３】
（ハードウェア構成）
図３０は、ＡＦＡのハードウェア構成の一例の図である。ＡＦＡ１は、図３０に示すように、ＣＰＵ９１、ＤＩＭＭ９２及びＳＳＤ９３を有する。ＣＰＵ９１は、ＤＩＭＭ９２及びＳＳＤ９３とバスで接続される。
【０１６４】
ＤＩＭＭ９２は、複数のＤＲＡＭを有する。そして、ＤＩＭＭ９２は、例えば、図１に例示した圧縮用情報記憶部１４及び圧縮バッファ１７の機能を実現する。また、ＳＳＤ９３は、図１に例示した記憶部３０の機能を実現する。
【０１６５】
さらに、記憶部３０は、図１に例示した、送受信部１１、特定部１２、圧縮バッファ割当部１３、共通領域圧縮部１５、個別領域圧縮部１６、再圧縮部１８、格納処理部１９及び読出部２０の各機能を実現するためのプログラムを含む各種プログラムを格納する。
【０１６６】
ＣＰＵ９１は、記憶部３０から各種プログラムを読み出し、ＤＩＭＭ９２のＤＲＡＭ上に展開して実行する。これにより、ＣＰＵ９１及びＤＩＭＭ９２は、図１に例示した、送受信部１１、特定部１２、圧縮バッファ割当部１３、共通領域圧縮部１５、個別領域圧縮部１６、再圧縮部１８、格納処理部１９及び読出部２０の各機能を実現する。
【符号の説明】
【０１６７】
１  ＡＦＡ
２  サーバ
３  ＦＣ
１１  送受信部
１２  特定部
１３  圧縮バッファ割当部
１４  圧縮用情報記憶部
１５  共通領域圧縮部
１６  個別領域圧縮部
１７  圧縮バッファ
１８  再圧縮部
１９  格納処理部
２０  読出部
３０  記憶部
１４１，１４２，１４４  ハッシュテーブル
１４３  メタデータ
１５１  第１圧縮部  
１５２  第２圧縮部
１６１  第３圧縮部
１６２  第４圧縮部
１８１  第１再圧縮部
１８２  第２再圧縮部
【図１】
2018132991.tif 000003
【図２】
2018132991.tif 000004
【図３】
2018132991.tif 000005
【図４】
2018132991.tif 000006
【図５】
2018132991.tif 000007
【図６】
2018132991.tif 000008
【図７】
2018132991.tif 000009
【図８】
2018132991.tif 000010
【図９】
2018132991.tif 000011
【図１０】
2018132991.tif 000012
【図１１】
2018132991.tif 000013
【図１２】
2018132991.tif 000014
【図１３】
2018132991.tif 000015
【図１４】
2018132991.tif 000016
【図１５】
2018132991.tif 000017
【図１６】
2018132991.tif 000018
【図１７】
2018132991.tif 000019
【図１８】
2018132991.tif 000020
【図１９】
2018132991.tif 000021
【図２０】
2018132991.tif 000022
【図２１】
2018132991.tif 000023
【図２２】
2018132991.tif 000024
【図２３】
2018132991.tif 000025
【図２４】
2018132991.tif 000026
【図２５】
2018132991.tif 000027
【図２６】
2018132991.tif 000028
【図２７】
2018132991.tif 000029
【図２８】
2018132991.tif 000030
【図２９】
2018132991.tif 000031
【図３０】
2018132991.tif 000032