(57)【要約】【課題】可変長のデータ断片の切り出し点を求めるのに用いられた識別子を当該データ断片の識別子として用いることができるようにする。【解決手段】仮チャンク区間設定部は、任意のデータからデータ断片を取り出すための開始オフセットと仮の終了位置を示す仮終了オフセットとを設定する（ステップ４０１，４０２）。識別子生成部は、前記任意のデータ上の前記開始オフセットから前記仮終了オフセットまでの区間内のデータ断片を仮データ断片として、当該仮データ断片の識別子を生成する（ステップ４０３）。切り出し点決定部は、前記仮データ断片の前記生成された識別子の値の一部または全部が予め定められた条件に合致するときに（ステップ４０６）、前記仮終了オフセットを、前記開始オフセットを基準に前記任意のデータからデータ断片を取り出すための終了オフセットとして決定する（ステップ４０９）。【選択図】      図４
2011065268.tif 000002
【特許請求の範囲】
【請求項１】
識別子生成手段、区間設定手段、切り出し点決定手段及び記憶手段を含む装置において、任意のデータから可変長のデータ断片を取り出すための開始・終了オフセットを決定する方法であって、
前記任意のデータからデータ断片を取り出すための開始位置を示す開始オフセットを前記区間設定手段が前記記憶手段に設定するステップと、
前記開始オフセットが設定された際に、当該開始オフセットに対応する仮の終了位置を示す仮終了オフセットを前記区間設定手段が前記記憶手段に設定するステップと、
前記任意のデータ上の前記開始オフセットから前記仮終了オフセットまでの区間内のデータ断片を仮データ断片として、当該仮データ断片を識別するための当該仮データ断片の識別子を前記識別子生成手段が生成するステップと、
前記仮データ断片の前記生成された識別子の値の一部または全部が予め定められた条件に合致するときに、前記仮終了オフセットを、前記開始オフセットを基準に前記任意のデータからデータ断片を取り出すための終了位置を示す終了オフセットとして前記切り出し点決定手段が決定するステップと
を具備することを特徴とする可変長のデータ断片の開始・終了オフセットを決定する方法。
【請求項２】
前記仮データ断片の前記生成された識別子の値の一部または全部が前記予め定められた条件に合致しないとき、前記開始オフセットから前記仮終了オフセットまでの区間が拡張されるように、前記区間設定手段が当該仮終了オフセットを設定し直すステップを更に具備することを特徴とする請求項１記載の可変長のデータ断片の開始・終了オフセットを決定する方法。
【請求項３】
前記終了オフセットが決定された場合、前記記憶手段に設定されている前記開始オフセットが、当該決定された終了オフセットの位置を前記任意のデータから次のデータ断片を取り出すための開始位置として示すように、前記区間設定手段が当該開始オフセットを設定し直すステップを更に具備することを特徴とする請求項２記載の可変長のデータ断片の開始・終了オフセットを決定する方法。
【請求項４】
前記予め定められた条件が、前記仮データ断片の前記生成された識別子の値の一部または全部が、予め定められた値と一致することである請求項３記載の可変長のデータ断片の開始・終了オフセットを決定する方法。
【請求項５】
前記予め定められた条件が、前記仮データ断片の前記生成された識別子の値の一部または全部が、当該仮データ断片の値の一部または全部と一致することである請求項３記載の可変長のデータ断片の開始・終了オフセットを決定する方法。
【請求項６】
前記開始オフセットから前記仮終了オフセットまでの区間の長さが予め定められた最大区間長以上である場合、前記仮データ断片の前記生成された識別子の値の一部または全部が前記予め定められた条件に合致するかに無関係に、当該仮終了オフセットが前記終了オフセットとして決定されることを特徴とする請求項３記載の可変長のデータ断片の開始・終了オフセットを決定する方法。
【請求項７】
前記開始オフセットから前記仮終了オフセットまでの区間の長さが予め定められた最小区間長未満である場合には、前記仮データ断片の前記生成された識別子の値の一部または全部が前記予め定められた条件に合致していても、前記仮終了オフセットが前記終了オフセットとして決定されずに、前記開始オフセットから前記仮終了オフセットまでの区間が拡張されるように当該仮終了オフセットが設定し直されることを特徴とする請求項３記載の可変長のデータ断片の開始・終了オフセットを決定する方法。
【請求項８】
任意のデータから可変長のデータ断片を取り出すための開始・終了オフセットを決定する装置において、
記憶手段と、
前記任意のデータからデータ断片を取り出すための開始位置を示す開始オフセット及び当該開始オフセットに対応する仮の終了位置を示す仮終了オフセットを前記記憶手段に設定する区間設定手段と、
前記任意のデータ上の前記開始オフセットから前記仮終了オフセットまでの区間内のデータ断片を仮データ断片として、当該仮データ断片を識別するための当該仮データ断片の識別子を生成する識別子生成手段と、
前記仮データ断片の前記生成された識別子の値の一部または全部が予め定められた条件に合致するときに、前記仮終了オフセットを、前記開始オフセットを基準に前記任意のデータからデータ断片を取り出すための終了オフセットとして決定する切り出し点決定手段と
を具備することを特徴とする開始・終了オフセットを決定する装置。
【請求項９】
前記区間設定手段は、前記仮データ断片の前記生成された識別子の値の一部または全部が前記予め定められた条件に合致しないとき、前記開始オフセットから前記仮終了オフセットまでの区間が拡張されるように当該仮終了オフセットを設定し直すことを特徴とする請求項８記載の開始・終了オフセットを決定する装置。
【請求項１０】
前記区間設定手段は、前記終了オフセットが決定された場合、前記記憶手段に設定されている前記開始オフセットが、当該決定された終了オフセットの位置を前記任意のデータから次のデータ断片を取り出すための開始位置として示すように、当該開始オフセットを設定し直し、且つ前記記憶手段に設定されている前記仮終了オフセットが当該設定し直された開始オフセットに対応するように当該仮終了オフセットを設定し直すことを特徴とする請求項９記載の開始・終了オフセットを決定する装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ間で重複するデータ断片を排除するために、任意のデータを可変長のデータ断片に分割するのに好適な、可変長のデータ断片の開始・終了オフセットを決定する方法及び装置に関する。
【背景技術】
【０００２】
昨今、官公庁・企業・個人のデータを管理する基盤は急速に肥大化・複雑化しており、その基盤の主要な構成要素である記憶装置に格納するデータも増大の一途をたどっている。このようなデータの保管・管理コストを削減するための１つの技術として、重複排除技術が注目されている。
【０００３】
重複排除技術とは、任意のデータ（以下、対象データと称する）を記憶装置に格納する際に、既に対象データと同じ内容のデータが当該記憶装置に格納されているかを検出、つまりデータの重複を検出し、既に格納されていれば当該対象データを例えばリンクで置き換えることにより重複データを１つにまとめる（排除する）技術をいう。この重複排除技術によれば、データの記憶に必要な記憶容量を少なくすることができる。
【０００４】
同じデータが記憶装置に格納されているか否かを高速に検出するためには、データの識別子を利用することが多い。即ち重複排除技術では一般に、データの重複を検出するのに、対象データ自身を既に記憶装置に格納されている全データと比較する手法ではなくて、対象データの識別子を求めてこれを既存の格納済みのデータの識別子の群と比較する手法が適用される。
【０００５】
データの重複は、予め定められた単位で検出される。この単位として、ファイルのようなデータ（コンテンツ）の一塊を用いることにより、データの重複を検出する第１の手法が古くから知られている。また最近では、上記の単位に、ファイルのようなデータを分割することによって得られるデータ断片（以下、チャンクと称する）を用いることにより、データの重複を検出する第２の手法が提案されている。第１の手法では、データの一部が異なるときにもデータ全体が異なるものであるとして処理される。これに対して第２の手法では、上記一部だけを処理すればよいという利点がある。
【０００６】
第２の手法を適用する重複排除技術では、一般に、以下のような手順を繰り返すことで重複排除が行われる。  
手順１）対象データからチャンクを切り出す。  
手順２）切り出されたチャンクの識別子を求める。  
手順３）切り出されたチャンクの識別子を既に記憶装置に格納済みのチャンクの群のそれぞれの識別子と比較する。もし、切り出されたチャンクと識別子が同一のチャンクがあれば、切り出されたチャンクと同一内容のチャンクであるとして、重複を排除する形式で、例えばリンクに置き換えることにより、切り出されたチャンクを記憶装置に格納する。
【０００７】
第２の手法を適用する重複排除技術では、手順１で実行されるチャンクの切り出しの方法、つまりどの長さでチャンクを切り出すかが重要である。第２の手法を適用する重複排除技術は、対象データからチャンクを切り出すときに当該チャンクの切り出し点を求める方法によって、大きく次の２種類に分類される。
【０００８】
Ａ）固定長重複排除方法
固定長重複排除方法とは、ある一定の長さでチャンクの切り出し点を定め、チャンク毎に重複検出・排除を行う方法である。  
Ｂ）可変長重複排除方法
可変長重複排除方法とは、対象データの内容に応じてデータ分割長を動的に調節して切り出し点を定め、チャンク毎に重複検出・排除を行う方法である。
【０００９】
以下、固定長重複排除方法及び可変長重複排除方法の違いについて、図１１を参照して説明する。  
図１１は、文書名が「文書＃１」の文書１１１及び文書名が「文書＃２」の文書１１２の２つの文書についてそれぞれ、チャンク切り出し点を固定長重複排除方法と可変長重複排除方法で求めた様子を示す。文書１１２は、文書１１１の一部を編集することによって、例えば文書１１１における文字列“name”及び“specified”の間に文字列“ABCD”を挿入することによって、生成された文書である。
【００１０】
固定長重複排除方法によれば、文書１１１及び文書１１２に対し、図１１において矢印１１３で示されるように、例えば１０文字の固定長を単位に、チャンクの切り出し点が定められる。一方、可変長重複排除方法によれば、文書１１１及び文書１１２に対し、図１１において矢印１１４で示されるように、データの中身に応じて、チャンクの切り出し点が定められる。この技術の詳細については後述する。
【００１１】
ここでは以下の点に注目されたい。  
固定長重複排除方法では、文書１１１と文書１１２との間で、文字列の挿入が発生した箇所から後ろ側、つまり文書の末尾側のチャンク全てが異なっている。  
これに対して可変長重複排除方法では、文書１１１と文書１１２との間で、文字列の挿入が発生した箇所周辺のチャンクが異なっているのみで、それより後ろ側のチャンクは全て一致している。
【００１２】
このように、固定長重複排除方法に比較して、可変長重複排除方法の方が、あるデータ間で、データの一部挿入／削除／変更が発生したときでも、その影響を極力抑えながら重複排除を実現できる。
【００１３】
上述のような可変長でのチャンク切り出し点の求め方と、それを利用した重複排除を行う方法は種々知られている。ここでは、特許文献１に記載されているような方法について、例を挙げて説明する。
【００１４】
特許文献１に記載の方法では、次の手順でチャンクの切り出し点が求められる。  
１）データ上のある連続する固定長の区間（以下、ウィンドウと称する）のデータ断片（バイト列）を取り出して、当該データ断片の識別子を求める。ここでは、ウィンドウの長さが２バイトであるとする。このデータ断片がチャンクとしてのデータ断片とは異なる点に注意すべきである。
【００１５】
２）求めた識別子の一部（例えば下位２ビット）が、予め定めた値（例えば０ｘ０１）と一致したときに、そこをチャンクの切り出し点とする。
【００１６】
図１２は、２バイト長のウィンドウＷ内の文字列（データ断片）の識別子を求めて、その識別子の下位２ビットが、予め定めた値０ｘ０１と一致するときにそこをチャンクの切り出し点として決定する場合の動作例を示す。図１２の例では、文書データ“The fil…”の先頭より２バイト（２文字）長の区間をウィンドウＷとして初期設定し、以後当該ウィンドウＷを１バイトずつシフトさせながら、当該ウィンドウＷ内の文字列の識別子を、例えば当該文字列のハッシュ値を計算することによって求めている。このハッシュ値の計算に用いられるハッシュ関数を、ｈα( )で表す。ウィンドウＷ内の文字列が“Th”であるものとすると、その識別子は、ｈα(“Th”)で表される。
【００１７】
ウィンドウＷ内の文字列“Th”の識別子ｈα(“Th”)が０ｘ１Ａであったとすると、当該識別子０ｘ１Ａの下位２ビットは０ｘ０２である。この識別子０ｘ１Ａの下位２ビットは、当該識別子０ｘ１Ａとマスクデータ０ｘ０３との論理積演算０ｘ１Ａ＆０ｘ０３によって求められる。識別子０ｘ１Ａの下位２ビット０ｘ０２は、予め定められた値０ｘ０１ではない。このため、このときのウィンドウＷの終端を、チャンクの切り出し点とはしない。
【００１８】
ウィンドウＷ内の文字列“ f”の識別子ｈα(“ f”)が０ｘ９９であったとすると、当該識別子０ｘ９９の下位２ビットは０ｘ０１である。これは予め定められた値０ｘ０１と同じなので、このときのウィンドウＷの終端をチャンクの切り出し点とする。これにより、文字列“The f”が切り出される。
【００１９】
この例では、チャンクの切り出し点を決定する条件とし、識別子の下位２ビットと予め定められた値との一致を用いているが、このビット数で、平均チャンクサイズが決定されることに注意されたい。例えば２ビットの場合、平均チャンクサイズは２2＝４バイトとなる。
【００２０】
以上のようにしてチャンクを切り出した上で、図１３に示すように、このチャンク自体の識別子を、例えば当該チャンクのハッシュ値を計算することによって求めている。切り出されたチャンクをＣAで表し、ハッシュ値の計算に用いられるハッシュ関数を、ｈβ( )で表す。チャンクＣAを構成する文字列が“The f”である図１３の例では、チャンクＣAの識別子は、ｈβ(“The f”)＝ｈβ(ＣA)で表される。以下の説明では、チャンクＣAの識別子をＨAで表す。
【００２１】
次に、前記手順３と同様に、求めたチャンクの識別子を、既に記憶装置に格納されているチャンクの群のそれぞれの識別子と比較する。もし、求めたチャンクと識別子が同一のチャンクがあれば、求めたチャンクと同一内容のチャンクが既に記憶装置に格納されているものとして処理する。これに対し、求めたチャンクと識別子が同一のチャンクがなければ、当該求めたチャンクを未だ記憶装置に格納されていない新しいチャンクとして処理する。  
上述の処理を、チャンクを求める毎に繰り返すことで、重複検出・排除を行う。
【００２２】
特許文献１に記載されたチャンクの切り出し方法によれば、例えば図１４に示す文書名が「文書＃１」の文書１１１（データ）は、識別子ＨxがＨA乃至ＨIの９つのチャンクを含むチャンクＣxの群に分割される。文書名が「文書＃１」の文書１１１から切り出されるチャンクＣxの群のそれぞれの識別子Ｈxは、図１４に示されるように、当該文書名「文書＃１」に対応付けて文書構成テーブル１４１に登録される。また、識別子ＨA乃至ＨIを含む識別子Ｈxの群のそれぞれと、その識別子Ｈxに対応するチャンクＣxとの一覧は、図１４に示されるようにチャンク一覧テーブル１４２に登録される。
【００２３】
また、特許文献２には、チャンクの切り出し点を求めるためウィンドウをシフトしながら識別子を求める方法に関して、ＲｏｌｌｉｎｇＨａｓｈｉｎｇの手法を適用することが記載されている。
【先行技術文献】
【特許文献】
【００２４】
【特許文献１】米国特許第５，９９０，８１０号明細書
【特許文献２】米国特許第６，８１０，３９８号明細書
【発明の概要】
【発明が解決しようとする課題】
【００２５】
上記特許文献１に記載されているような従来の可変長重複排除方法（以下、従来技術と称する）では、可変長のチャンク（つまりデータ断片）の切り出しのため、識別子の計算を２段階に分けて行う必要がある。即ち従来技術では、１）可変長のデータ断片の切り出し点を求めるための識別子の計算と、２）重複検出に利用するための可変長のデータ断片自体の識別子の計算とを必要とする。
【００２６】
本発明は上記事情を考慮してなされたものでその目的は、可変長のデータ断片の切り出し点を求めるのに用いられた識別子を当該データ断片の識別子として用いることができ、これにより計算処理を少なくすることのできる可変長のデータ断片の開始・終了オフセットを決定する方法及び装置を提供することにある。
【課題を解決するための手段】
【００２７】
本発明の１つの観点によれば、識別子生成手段、区間設定手段、切り出し点決定手段及び記憶手段を含む装置において、任意のデータから可変長のデータ断片を取り出すための開始・終了オフセットを決定する方法が提供される。この方法は、前記任意のデータからデータ断片を取り出すための開始位置を示す開始オフセットを前記区間設定手段が前記記憶手段に設定するステップと、前記開始オフセットが設定された際に、当該開始オフセットに対応する仮の終了位置を示す仮終了オフセットを前記区間設定手段が前記記憶手段に設定するステップと、前記任意のデータ上の前記開始オフセットから前記仮終了オフセットまでの区間内のデータ断片を仮データ断片として、当該仮データ断片を識別するための当該仮データ断片の識別子を前記識別子生成手段が生成するステップと、前記仮データ断片の前記生成された識別子の値の一部または全部が予め定められた条件に合致するときに、前記仮終了オフセットを、前記開始オフセットを基準に前記任意のデータからデータ断片を取り出すための終了位置を示す終了オフセットとして前記切り出し点決定手段が決定するステップとを具備することを特徴とする。
【発明の効果】
【００２８】
本発明によれば、開始オフセットから仮終了オフセットまでの区間内の仮データ断片の識別子の一部または全部が予め定められた条件に合致するときに、当該仮終了オフセットが、開始オフセットを基準に任意のデータからデータ断片を取り出すための終了オフセットとして決定される。このとき、仮データ断片は、開始オフセットから当該決定された終了オフセットまでの区間内のデータ断片（つまり取り出されるべきデータ断片）それ自体であり、したがって仮データ断片の識別子は、当該データ断片の識別子それ自体でもある。よって本発明によれば、データ断片の切り出し点である終了オフセットが決定された時点で、当該終了オフセットを決定するのに用いられた識別子を当該データ断片の識別子として用いることができ、これにより計算処理を少なくすることができる。
【図面の簡単な説明】
【００２９】
【図１】本発明の一実施形態に係るストレージシステムの構成を示すブロック図。
【図２】図１に示される文書格納装置のハードウェア構成を示すブロック図。
【図３】図１に示される文書格納装置の主として機能構成を示すブロック図。
【図４】同実施形態で適用される文書格納処理の手順を示すフローチャート。
【図５】同文書格納処理に含まれているチャンク登録処理の詳細な手順を示すフローチャート。
【図６】同文書格納処理におけるチャンク切り出し点を設定する動作の過程の一例を示す図。
【図７】同文書格納処理によって２つの文書の重複検出・排除を行って、文書構成テーブル及びチャンク一覧テーブルを構成した例を示す図。
【図８】同実施形態で適用される文書取得処理の手順を示すフローチャート。
【図９】同実施形態の変形例で適用される文書格納処理の手順を示すフローチャート。
【図１０】同実施形態の変形例で適用される文書格納処理におけるチャンク切り出し点を設定する動作の過程の一例を示す図。
【図１１】従来技術における固定長重複排除方法及び可変長重複排除方法の違いを説明するための図。
【図１２】従来技術における可変長重複排除方法で適用されるチャンク切り出し点を設定する動作の過程の一例を示す図。
【図１３】従来技術におけるチャンク切り出し方法を説明するための図。
【図１４】従来技術における可変長重複排除方法によって２つの文書の重複検出・排除を行って、文書構成テーブル及びチャンク一覧テーブルを構成した例を示す図。
【発明を実施するための形態】
【００３０】
以下、本発明の実施の形態につき図面を参照して説明する。  
＜システム構成＞
図１は本発明の一実施形態に係るストレージシステムの構成を示すブロック図である。このストレージシステムは、文書格納装置１０と、クライアント装置２０とから構成される。文書格納装置１０とクライアント装置２０とは、例えばネットワーク３０によって接続されている。文書格納装置１０は文書をチャンクに分割して格納するためのデータ記憶装置である。クライアント装置２０は、文書格納装置１０を自身の記憶装置として利用する。つまりクライアント装置２０は、例えば当該クライアント装置２０上で動作するアプリケーションプログラムに従い、文書格納装置１０に対して文書格納を指示することにより当該文書格納装置１０に文書を格納させ、また文書格納装置１０に対して文書取得を指示することにより文書格納装置１０から文書を取得する。なお、文書格納装置１０とクライアント装置２０とが直接に接続されていても、クライアント装置２０としての機能が文書格納装置１０に内蔵されていても構わない。
【００３１】
文書格納装置１０は、クライアント装置２０から文書名で指定される文書の格納を指示するための文書格納指示が与えられると、後述する手続きに従って、当該文書名で指定される文書をチャンクに分割しながら重複検出・排除を行った上で、当該文書を後述する文書格納部３２（図３参照）に格納する。また文書格納装置１０は、クライアント装置２０から文書名で指定される文書の取得を指示するための文書取得指示が与えられると、当該文書名で指定される文書を文書格納部３２から取り出してクライアント装置２０に出力する。ここでの文書とは例えばファイルまたは当該ファイル内のデータを指し、文書名とはファイル名を指す。なお、ファイルと当該ファイル内のデータとを区別するために、当該ファイル内のデータを文書のデータまたは文書データと称することもある。
【００３２】
＜文書格納装置１０のハードウェア構成＞
本実施形態において、文書格納装置１０はコンピュータを用いて実現される。図２は、このような文書格納装置１０のハードウェア構成を示すブロック図である。図２に示されるように、文書格納装置１０、少なくとも１つの処理ユニット２１、主記憶装置２２、補助記憶装置２３、通信機構２４及び入出力装置２５の周知のハードウェア構成を有する。補助記憶装置２３は、例えばハードディスクドライブを用いて構成される。補助記憶装置２３は、処理ユニット２１によって実行されるプログラム２３０を格納した記憶媒体２３１を備えている。本実施形態において記憶媒体２３１はディスク媒体である。
【００３３】
＜文書格納装置１０の機能構成＞
図３は、文書格納装置１０の主として機能構成を示すブロック図である。文書格納装置１０は、文書格納部３１と、命令受け付けモジュール３２と、可変長重複排除モジュール３３と、作業用メモリ３４とを含む。本実施形態において、文書格納装置１０内の命令受け付けモジュール３２及び可変長重複排除モジュール３３は、当該文書格納装置１０が図２に示されるハードウェア構成のコンピュータから構成される場合に、当該コンピュータ内の処理ユニット２１が、補助記憶装置２３に格納されているプログラム２３０を主記憶装置２２に読み込んで実行することにより実現されるものとする。しかし、命令受け付けモジュール３２及び可変長重複排除モジュール３３の少なくとも１つがハードウェアとして実現されてもよい。
【００３４】
文書格納部３１は、文書構成テーブル３１１及びチャンク一覧テーブル３１２を用いて文書の群を格納する。文書格納部３１は、図２に示される補助記憶装置２３の記憶領域の一部を用いて実現される。文書構成テーブル３１１及びチャンク一覧テーブル３１２は、それぞれ、従来技術で適用されている文書構成テーブル１４１及びチャンク一覧テーブル１４２（図１４参照）に相当する。
【００３５】
文書構成テーブル３１１は、文書格納部３１に格納される文書の群のそれぞれについて、その文書の文書名と、その文書を構成するチャンクの群の識別子（ハッシュ値）の配列（つまりリスト）とを対応付けて保持する。チャンク一覧テーブル３１２は、文書格納部３１に格納される文書を構成するチャンクのそれぞれについて、そのチャンクと、そのチャンクの識別子（ハッシュ値）とを対応付けて保持する。つまり、文書格納部３１には、文書が、当該文書を構成するチャンクの群に分割して格納される。
【００３６】
命令受け付けモジュール３２は、クライアント装置２０からの指示を受け付けて、当該指示の内容に従って動作する。命令受け付けモジュール３２は、クライアント装置２０からの指示が文書格納指示の場合、当該文書格納指示を可変長重複排除モジュール３３に渡すことにより、当該可変長重複排除モジュール３３による文書格納処理を行わせる。命令受け付けモジュール３２は、クライアント装置２０からの指示が文書取得指示の場合に動作する文書取得部３２０を含む。文書取得部３２０は、文書取得指示に従い、指定された文書名の文書のデータを文書格納部３１から取得するための文書取得処理を行う。文書取得部３２０によって取得された文書のデータは命令受け付けモジュール３２によってクライアント装置２０に出力される。
【００３７】
可変長重複排除モジュール３３は、命令受け付けモジュール３２から渡された文書格納指示に従い、指定された文書のデータから可変長でチャンクを切り出すためのチャンク切り出し処理と、切り出されたチャンク毎に重複を検出してそれを排除するための重複検出・排除処理とを行いながら、文書格納部３１に当該文書を格納する。可変長重複排除モジュール３３は、識別子生成部３３１と、仮チャンク区間設定部３３２と、切り出し点決定部３３３と、チャンク登録部３３４とを含む。
【００３８】
識別子生成部３３１は、チャンクの切り出しと重複検出で利用される当該チャンク（または後述する仮チャンク）の識別子を生成する。本実施形態では、識別子としてチャンク（または仮チャンク）のハッシュ値が用いられる。このハッシュ値には、例えばＳＨＡ１などのハッシュ関数を利用して生成された値が用いられる。
【００３９】
仮チャンク区間設定部３３２は、指定された文書のデータ（文書データ）からチャンクを切り出すのに必要な可変長の区間を当該文書データ上に設定する。切り出し点決定部３３３は、仮チャンク区間設定部３３２によって文書データ上に設定された区間のデータ断片（以下、仮チャンクと称する）の識別子に基づいて、チャンクの切り出し点を決定する。仮チャンク区間設定部３３２によって設定される区間を仮チャンクの区間と称する。仮チャンク区間設定部３３２は、チャンクの切り出し点が決定されるまで、仮チャンクの区間を一定長ずつ文書データの末尾の方向に拡張する。
【００４０】
チャンク登録部３３４は、切り出し点決定部３３３によって切り出し点が決定された際の仮チャンクをチャンクとして、当該チャンクを文書格納部３１に登録するためのチャンク登録処理を行う。このチャンク登録処理においてチャンク登録部３３４は、登録すべきチャンクの識別子に一致する識別子がチャンク一覧テーブル３１２に既に登録されていることを検出するための重複検出を行う。チャンク登録部３３４は、この重複検出の結果に基づいて、対応するチャンクを当該チャンクの識別子に対応付けて文書格納部３１内のチャンク一覧テーブル３１２に登録するか否か（つまり重複を排除するか）を決定する。チャンク登録部３３４はまた、重複検出の結果に無関係に、登録すべきチャンクの識別子を当該チャンクが切り出された文書の文書名に対応付けて文書構成テーブル３１１に登録する。
【００４１】
作業用メモリ３４は、可変長重複排除モジュール３３によるチャンク切り出し処理と重複検出・排除処理のための作業用の記憶領域を提供する。作業用メモリ３４は、図２に示される主記憶装置２２の記憶領域の一部を用いて実現される。作業用メモリ３４の記憶領域の一部は、処理の対象となる文書データを一時格納するための文書バッファ３４１として用いられる。作業用メモリ３４の記憶領域の他の一部は、処理に用いられる各種変数を一時格納するためのレジスタ部３４２として用いられる。レジスタ部３４２は、後述する開始オフセットレジスタ、仮終了オフセットレジスタ、仮チャンクレジスタ及び識別子レジスタを含む。
【００４２】
＜文書格納処理＞
次に、文書格納装置１０における文書格納処理について、図４のフローチャートを参照して説明する。  
まず、クライアント装置２０から文書格納装置１０にネットワーク３０を介して文書格納指示が送られたものとする。この文書格納指示は、文書格納装置１０に格納されるべき文書を指定する文書名を含んでいる。
【００４３】
文書格納装置１０に送られたクライアント装置２０からの文書格納指示は、当該文書格納装置１０の命令受け付けモジュール３２で受け付けられる。命令受け付けモジュール３２は、この文書格納指示を受け付けると、当該文書格納指示で指定される文書名の文書のデータをクライアント装置２０から入力する。そして命令受け付けモジュール３２は、クライアント装置２０からの文書格納指示を、当該文書格納指示で指定された文書名の文書のデータ（以下、文書データと称する）と共に可変長重複排除モジュール３３に渡す。すると可変長重複排除モジュール３３は、可変長重複排除モジュール３３から渡された文書データを作業用メモリ３４内の文書バッファ３４１に格納して、図４のフローチャートに示す手順の文書格納処理を実行する。即ち可変長重複排除モジュール３３は、文書バッファ３４１に格納されている文書データの先頭から末尾に至るまで、以下の処理を繰り返す。
【００４４】
まず可変長重複排除モジュール３３の仮チャンク区間設定部３３２は、切り出し点決定部３３３によるチャンクの切り出し点の決定のために、文書データの先頭位置（ここでは先頭バイトの位置）を当該チャンクの開始オフセットＯsとしてレジスタ部３４２内の開始オフセットレジスタに設定する（ステップ４０１）。本実施形態において、チャンクの切り出し点は、開始オフセットＯsと終了オフセットＯeとにより表される。
【００４５】
開始オフセットＯsはチャンクの開始切り出し点を示すもので、当該開始切り出し点の文書データの先頭位置からのオフセット（相対位置）を示す。終了オフセットＯeはチャンクの終了切り出し点を示すもので、当該終了切り出し点の文書データの先頭位置からのオフセットを示す。終了オフセットＯeは、次のチャンクの開始オフセットとなり、当該次のチャンクの開始切り出し点をも示す。したがって以降の説明では、終了オフセットＯeを、単にチャンクの切り出し点と呼ぶこともある。
【００４６】
次に仮チャンク区間設定部３３２は、開始オフセットＯsに対応する位置、例えば当該開始オフセットＯsに１（単位は例えばバイト）を加算した位置、つまり文書データにおける開始オフセットＯsの位置から文書データの末尾側に１バイトだけ移動した位置を、上記チャンクの仮の終了オフセット（以下、仮終了オフセットと称する）Ｏe’としてレジスタ部３４２内の仮終了オフセットレジスタに設定する（ステップ４０２）。すると可変長重複排除モジュール３３の識別子生成部３３１は、文書データにおける、開始オフセットＯsの位置から仮終了オフセットＯe’の位置までの区間のデータ断片を仮チャンク（仮のチャンク）Ｃ’として切り出して、当該仮チャンクＣ’のハッシュ値ＨC’を当該仮チャンクＣ’の識別子ＨC’として生成する（ステップ４０３）。この仮チャンクＣ’の識別子ＨC’は、レジスタ部３４２内の識別子レジスタに保持される。
【００４７】
識別子生成部３３１によって仮チャンクＣ’の識別子ＨC’が生成されると、可変長重複排除モジュール３３の切り出し点決定部３３３は、仮終了オフセットＯe’の位置が文書データの終了位置に達しているかを判定する（ステップ４０４）。もし、仮終了オフセットＯe’の位置が文書データの終了位置に達していないならば（ステップ４０４のＮｏ）、切り出し点決定部３３３は、開始オフセットＯsの位置から仮終了オフセットＯe’の位置までの仮チャンクＣ’の区間（ウィンドウ）の長さ、つまり「Ｏe’−Ｏs」の値が、予め定められた最大区間長Ｌmax未満であるかを判定する（ステップ４０５）。
【００４８】
もし、「Ｏe’−Ｏs」の値がＬmax未満であるならば（ステップ４０５のＹｅｓ）、切り出し点決定部３３３は、識別子生成部３３１によって生成された識別子ＨC’の一部または全部の値、例えば識別子ＨC’の下位ｍビットの値が、予め定められた値（以下、規定値と称する）Ａに一致するかを判定する（ステップ４０６）。もし、識別子ＨC’の下位ｍビットの値が規定値Ａに一致しないならば（ステップ４０６のＮｏ）、切り出し点決定部３３３は、現在の仮終了オフセットＯe’は切り出し点ではないと判断する。この場合、仮チャンク区間設定部３３２は、仮終了オフセットＯe’に１（バイト）を加算した位置を新たな仮終了オフセットＯe’として、レジスタ部３４２内の仮終了オフセットレジスタに再設定する（ステップ４０７）。つまり仮チャンク区間設定部３３２は、開始オフセットＯsを変えずに、仮終了オフセットＯe’だけを文書データの末尾側に１だけずらすことにより、仮チャンクＣ’の区間（ウィンドウ）を終端側に１バイトだけ拡張する。このように本実施形態では、切り出し点を決定するのに用いられるウィンドウ（仮チャンクＣ’の区間）が終端側に拡張される点で、固定長のウィンドウがシフトされる従来技術と相違する。
【００４９】
これに対し、識別子ＨC’の下位ｍビットの値が規定値Ａに一致するならば（ステップ４０６のＹｅｓ）、切り出し点決定部３３３は、「Ｏe’−Ｏs」の値が、予め定められた最小区間長Ｌmin以上であるかを判定する（ステップ４０８）。
【００５０】
もし、「Ｏe’−Ｏs」の値が、予め定められた最小区間長Ｌmin以上であるならば（ステップ４０８のＹｅｓ）、切り出し点決定部３３３は現在の仮終了オフセットＯe’を切り出し点であると決定する。この場合、切り出し点決定部３３３はステップ４０９に進む。
【００５１】
これに対し、「Ｏe’−Ｏs」の値が最小区間長Ｌmin以上でないならば（ステップ４０８のＮｏ）、つまり「Ｏe’−Ｏs」の値が最小区間長Ｌmin未満であるならば、切り出し点決定部３３３は、識別子ＨC’の下位ｍビットの値が規定値Ａに一致しているにも拘わらずに、現在の仮終了オフセットＯe’を切り出し点としないことを決定する。これにより、切り出し点で切り出されるチャンクが細分化してしまうことを抑止することができる。
【００５２】
さて切り出し点決定部３３３は、ステップ４０８の判定結果がＮｏであるならば、次善の切り出し点（終了オフセットＯe）を決定するために、識別子ＨC’の下位ｍビットの値が規定値Ａに一致していない場合（ステップ４０６のＮｏ）と同様にステップ４０７に進む。このステップ４０７において、切り出し点決定部３３３は、仮終了オフセットＯe’に１を加算した位置を新たな仮終了オフセットＯe’として設定する。
【００５３】
なお、ステップ４０８は必ずしも必要でない。即ち、識別子ＨC’の下位ｍビットの値が規定値Ａに一致しているならば（ステップ４０６のＹｅｓ）、「Ｏe’−Ｏs」の値が最小区間長Ｌmin以上であるか否かに無関係に、現在の仮終了オフセットＯe’が切り出し点であると決定されても構わない。
【００５４】
仮チャンク区間設定部３３２によってステップ４０７が実行されると、つまり仮チャンクＣ’の区間が終端側に１バイトだけ拡張されると、識別子生成部３３１は再びステップ４０３を実行する。即ち識別子生成部３３１は、文書データにおける、開始オフセットＯsの位置から新たな仮終了オフセットＯe’の位置までの区間のデータ断片を、仮チャンクＣ’として切り出して、当該仮チャンクＣ’の識別子ＨC’を新たに生成する（ステップ４０３）。
【００５５】
一方、開始オフセットＯsの位置から新たな仮終了オフセットＯe’までの区間の長さ（「Ｏe’−Ｏs」の値）がＬmax未満でないならば（ステップ４０５のＮｏ）、つまり「Ｏe’−Ｏs」の値がＬmax以上であるならば、切り出し点決定部３３３は現在の仮終了オフセットＯe’を切り出し点であると決定する。このように切り出し点決定部３３３は、「Ｏe’−Ｏs」の値がＬmax以上になると、識別子ＨC’の下位ｍビットの値が規定値Ａに一致しているか否かに無関係に、現在の仮終了オフセットＯe’を切り出し点であると決定する。これにより、切り出し点で切り出されるチャンクが巨大化してしまうことを抑止できる。
【００５６】
さて切り出し点決定部３３３は、ステップ４０５の判定結果がＮｏであるために、現在の仮終了オフセットＯe’を切り出し点であると決定すると、ステップ４０８の判定がＹｅｓの場合と同様にステップ４０９に進む。
【００５７】
ステップ４０９においてチャンク登録部３３４は、当該ステップ４０９が実行される時点における仮終了オフセットＯe’、仮チャンクＣ’、当該仮チャンクＣ’の識別子ＨC’を、それぞれ、終了オフセットＯe、チャンクＣ、当該チャンクＣの識別子ＨCとして設定する。このステップ４０９において、仮終了オフセットＯe’が終了オフセットＯeとして設定されたことにより、チャンクＣの切り出し点が取得されたことになる。
【００５８】
このように本実施形態では、文書格納装置１０が、可変長のチャンク（データ断片）の開始・終了オフセットを決定する装置として機能する。そして、開始オフセットＯsと仮終了オフセットＯe’とから定まる仮チャンクＣ’の識別子（ハッシュ値）ＨC’の下位ｍビットが、規定値Ａと一致したとき、その仮終了オフセットＯe’がチャンクＣの終了オフセットＯe、つまりチャンクＣの切り出し点として決定される。このとき、仮チャンクＣ’の識別子ＨC’は、チャンクＣの識別子ＨC’でもあることに注意されたい。したがって本実施形態においては、チャンクＣの切り出し点が決定された時点で、当該チャンクＣの識別子ＨCを新たな識別子（ハッシュ値）計算を行うことなく取得できる。つまり本実施形態においては、従来技術で可変長のチャンクの切り出しのために必要であった２段階の識別子計算処理を１段階に減らすことができる。
【００５９】
また本実施形態では、仮チャンクＣ’（チャンクＣ）の長さが、Ｌmin以上となるように調整される。更に本実施形態では、仮チャンクＣ’（チャンクＣ）の長さ’の長さ、つまり開始オフセットＯsの位置から仮終了オフセットＯe’までの区間の長さがＬmax以上になると、当該仮チャンクＣ’の識別子ＨC’の下位ｍビットが規定値Ａに一致するか否かに無関係に、その仮終了オフセットＯe’がチャンクＣの切り出し点として決定される。これにより仮チャンクＣ’（チャンクＣ）の長さは、Ｌmin以上Ｌmax未満となるように調整される。
【００６０】
さて、切り出し点決定部３３３によってステップ４０９が実行されると、可変長重複排除モジュール３３のチャンク登録部３３４は、チャンクＣに関する情報を文書構成テーブル３１１及びチャンク一覧テーブル３１２に登録するためのチャンク登録処理（ステップ４１０）を実行する。このチャンク登録処理については後述する。
【００６１】
チャンク登録部３３４によるチャンク登録処理（ステップ４１０）が終了すると、仮チャンク区間設定部３３２は現在の仮終了オフセットＯe’を新たな開始オフセットＯsとしてレジスタ部３４２内の開始オフセットレジスタに設定する（ステップ４１１）。つまり仮チャンク区間設定部３３２は、レジスタ部３４２内の開始オフセットレジスタに設定されている開始オフセットＯsが、仮終了オフセットＯe’（＝終了オフセットＯe）の位置を次のチャンク切り出しのための開始位置（開始切り出し点）として示すように、当該開始オフセットＯsを更新（再設定）する。
【００６２】
仮チャンク区間設定部３３２はステップ４１１を実行し終えるとステップ４０２に戻り、当該ステップ４１１で更新された開始オフセットＯsに１を加算した位置を、新たな仮終了オフセットＯe’としてレジスタ部３４２内の開始オフセットレジスタに設定する。すると可変長重複排除モジュール３３では、ステップ４０３以降の処理が再び実行される。
【００６３】
やがて、仮終了オフセットＯe’が文書データの終了位置に達したならば（ステップ４０４のＹｅｓ）、切り出し点決定部３３３は現在の仮終了オフセットＯe’を切り出し点であると決定する。この場合、切り出し点決定部３３３はステップ４１２に進む。ステップ４１２において切り出し点決定部３３３は、上記ステップ４０９と同様に、現在（当該ステップ４１２が実行される時点）の仮終了オフセットＯe’、仮チャンクＣ’、当該仮チャンクＣ’の識別子ＨC’を、それぞれ、終了オフセットＯe、チャンクＣ、当該チャンクＣの識別子ＨCとして設定する。
【００６４】
切り出し点決定部３３３によってステップ４１２が実行されると、チャンク登録部３３４は、チャンクＣに関する情報を文書構成テーブル３１１及びチャンク一覧テーブル３１２に登録するためのチャンク登録処理（ステップ４１３）を実行する。可変長重複排除モジュール３３は、切り出し点決定部３３３によるチャンク登録処理（ステップ４１３）が終了すると、文書格納処理を終了する。この場合、可変長重複排除モジュール３３は、命令受け付けモジュール３２にクライアント装置２０からの文書格納指示に対する文書格納処理の完了を通知する。すると命令受け付けモジュール３２は、文書格納処理の完了を通知するための完了応答をクライアント装置２０に返す。
【００６５】
次に、上記ステップ４１０または４１３でチャンク登録部３３４によって実行されるチャンク登録処理について、図５のフローチャートを参照して説明する。  
まずチャンク登録部３３４は、直前のステップ４０９または４１２で設定されたチャンクＣの識別子ＨC（に一致する識別子Ｈx）がチャンク一覧テーブル３１２に登録されているかを判定する（ステップ５０１）。このステップ５０１は、チャンクＣと同一内容のチャンクＣxが、既に文書格納部３１に格納されている重複を検出するために実行される。
【００６６】
もし、チャンクＣの識別子ＨC（に一致する識別子Ｈx）がチャンク一覧テーブル３１２に登録されているならば（ステップ５０１のＹｅｓ）、チャンク登録部３３４はチャンクＣの重複が検出されたものとしてステップ５０２に進む。
【００６７】
ここで、チャンクＣの識別子ＨCに一致する識別子Ｈxと対応付けてチャンク一覧テーブル３１２に登録されているチャンクが、チャンクＣxであるものとする。このチャンクＣxのビット列とチャンクＣのビット列とは、識別子の計算に用いるハッシュ関数によっては、必ずしも一致するとは限らない。そこで、上記ステップ５０１において、チャンクＣの識別子ＨCに一致する識別子Ｈxがチャンク一覧テーブル３１２に登録されているけでなく、チャンクＣのビット列に一致するチャンクＣxのビット列が、当該識別子Ｈxと対応付けてチャンク一覧テーブル３１２に登録されているかを判定するとよい。このようにすると、より高精度の重複検出が行えて、いわゆるハッシュ衝突を防止することができる。
【００６８】
ステップ５０２においてチャンク登録部３３４は、チャンクＣを含む文書の文書名に対応付けて当該チャンクＣの識別子（ハッシュ値）ＨCを文書構成テーブル３１１に登録する。ここで、既にチャンクＣを含む文書の文書名が文書構成テーブル３１１に登録されている場合、チャンク登録部３３４は、当該文書名に対応付けて文書構成テーブル３１１に既に登録されている識別子の配列の末尾にチャンクＣの識別子ＨCを追加する。これにより、チャンクＣを含む文書の文書名に対応付けて文書構成テーブル３１１に登録される識別子の並び順は、当該文書から対応するチャンクが切り出される順番、つまり対応するチャンクの当該文書における並び順に一致する。
【００６９】
本実施形態では、ステップ５０２において、チャンクＣと当該チャンクＣの識別子ＨCとの対がチャンク一覧テーブル３１２に登録されない点に注意されたい。つまり、クライアント装置２０からの文書格納指示で指定された文書から切り出されたチャンクＣと同一内容のチャンクＣxが既に文書格納部３１内のチャンク一覧テーブル３１２に登録されている重複が検出された場合（ステップ５０１のＹｅｓ）、当該チャンクＣが排除される。その一方、チャンクＣを含む文書の文書名に対応付けて識別子ＨCが文書構成テーブル３１１に登録される。これにより、チャンク一覧テーブル３１２に既に登録されているチャンクＣx（つまりチャンクＣと同一内容のチャンクＣx）は、チャンクＣを含む文書の文書名に対応付けて文書構成テーブル３１１に登録された識別子ＨC、及び当該チャンクＣxを含む文書の文書名に対応付けて文書構成テーブル３１１に既に登録されている識別子Ｈx（＝ＨC）とリンク付けされる。つまり、チャンクＣx（＝Ｃ）が、チャンクＣを含む文書の文書名に対応付けられた識別子ＨC及び当該チャンクＣxを含む文書の文書名に対応付けられた識別子Ｈx（＝ＨC）により共有される。
【００７０】
これに対し、チャンクＣの識別子ＨC（に一致する識別子Ｈx）がチャンク一覧テーブル３１２に登録されていないならば（ステップ５０１のＹｅｓ）、チャンク登録部３３４はステップ５０３に進む。ステップ５０３においてチャンク登録部３３４は、チャンクＣと当該チャンクＣの識別子ＨCとを対応付けてチャンク一覧テーブル３１２に登録し、且つ当該チャンクＣを含む文書の文書名に対応付けて識別子ＨCを文書構成テーブル３１１に登録する。チャンク登録部３３４は、ステップ５０２または５０３を実行すると、チャンク登録処理を終了する。
【００７１】
＜文書格納処理の具体例＞
次に、可変長重複排除モジュール３３による文書格納処理の具体例について、図６及び図７を参照して説明する。  
図６はチャンク切り出し点を設定する動作の過程の一例を示す。  
図６の例では、仮チャンクＣ’の識別子ＨC’の下位２ビット（ｍ＝２）が、規定値０ｘ０１（Ａ＝０ｘ０１）に一致したときに、当該仮チャンクＣ’の終了オフセットである仮終了オフセットＯe’が、チャンクＣの終了オフセットＯeと決定される。このチャンクＣの終了オフセットＯeは、例えば次のように決定される。ここで、仮チャンクＣ’の識別子（ハッシュ値）ＨC’の計算に用いられるハッシュ関数をｈβ( )のように表す。
【００７２】
文書データ“The fil…”における仮チャンクＣ’が仮チャンク“Th”であり、当該仮チャンク“Th”の識別子ｈβ(“Th”)が０ｘ５Ａであるものとする。この識別子０ｘ５Ａの下位２ビットは０ｘ０２である。この識別子０ｘ５Ａの下位２ビットは、当該識別子０ｘ５Ａとマスクデータ０ｘ０３との論理積演算０ｘ５Ａ＆０ｘ０３によって求められる。識別子０ｘ５Ａの下位２ビット０ｘ０２は、規定値０ｘ０１に一致しない。このため、仮チャンクＣ’の区間は、文書データ“The fil…”の末尾側に１（１バイト）だけ広げられる。
【００７３】
すると仮チャンクＣ’は、仮チャンク“The”となる。仮チャンク“The”の識別子ｈβ(“The”)が０ｘＦ２であるものとする。この識別子０ｘＦ２の下位２ビットは０ｘ０２であり、規定値０ｘ０１に一致しない。このため、仮チャンクＣ’の区間は更に１だけ広げられる。すると仮チャンクＣ’は、仮チャンク“The ”となる。仮チャンク“The ”の識別子ｈβ(“The ”)が０ｘ７Ｃであるものとする。この識別子０ｘ７Ｃの下位２ビットは０ｘ００であり、規定値０ｘ０１に一致しない。このため、仮チャンクＣ’の区間は更に１だけ広げられる。
【００７４】
すると仮チャンクＣ’は、仮チャンク“The f”となる。仮チャンク“The f”の識別子ｈβ(“The f”)が０ｘ９９であるものとする。この識別子０ｘ９９の下位２ビットは０ｘ０１であり、規定値０ｘ０１に一致する。したがって、仮チャンク“The f”の終端位置（仮終了オフセット）が切り出し点として決定される。
【００７５】
図７は、図６の例のようにしてチャンクを切り出しながら文書名が「文書＃１」の文書７０１及び文書名が「文書＃２」の文書７０２の２つの文書の重複検出・排除を行って、文書構成テーブル３１１及びチャンク一覧テーブル３１２を構成した例を示す。文書７０２は、文書７０１の一部を編集することによって、例えば文書７０１における文字列“name”及び“specified”の間に文字列“ABCD”を挿入することによって、生成された文書である。
【００７６】
図７の例では、文書７０１（のデータ）は、識別子ＨxがＨA乃至ＨIの９つのチャンクを含むチャンクＣxの群に分割される。文書７０１から切り出されるチャンクＣxの群のそれぞれの識別子Ｈxは、図７に示されるように、当該文書７０１の文書名「文書＃１」に対応付けて、当該チャンクＣxが切り出される順の配列で文書構成テーブル３１１に保持される。また、識別子ＨA乃至ＨIを含む識別子Ｈxの群のそれぞれと、その識別子Ｈxに対応するチャンクＣxとの一覧は、図７に示されるようにチャンク一覧テーブル３１２に保持される。
【００７７】
このような状態で、文書７０２を文書格納部３１に格納するための文書格納処理が行われたものとする。また、この文書格納処理におけるチャンク切り出しにより、文書７０２が、識別子ＨxがＨA乃至ＨIとＨX及びＨYとの１１のチャンクを含むチャンクＣxの群に分割されるものとする。この文書７０２から切り出されるチャンクＣxの群のそれぞれの識別子Ｈxは、図７に示されるように、当該文書７０２の文書名「文書＃２」に対応付けて文書構成テーブル３１１に保持される。ここで、文書７０２から切り出されるチャンクＣxの群の識別子ＨxであるＨA乃至ＨIとＨX及びＨYとのうち、ＨA乃至ＨIは、対応するチャンクと対をなして既にチャンク一覧テーブル３１２に登録されている。この場合、文書７０２から切り出されるチャンクＣxの群の識別子Ｈxのうち、識別子ＨX及びＨYのように未だチャンク一覧テーブル３１２に登録されていない識別子のみが、図７に示すように、対応するチャンクと対をなしてチャンク一覧テーブル３１２に登録される。
【００７８】
このように本実施形態においては、可変長でチャンクの切り出しが行われることで、文書名が「文書＃１」の文書７０１と文書名が「文書＃２」の文書７０２との間で重複する文字列が排除される形で当該文書７０１及び７０２が格納される。
【００７９】
＜文書取得処理＞
次に、文書格納装置１０における文書取得処理について、図８のフローチャートを参照して説明する。  
まず、クライアント装置２０から文書格納装置１０にネットワーク３０を介して文書取得指示が送られたものとする。この文書取得指示は、文書格納装置１０から取得されるべき文書を指定する文書名を含んでいる。
【００８０】
文書格納装置１０に送られたクライアント装置２０からの文書取得指示は、当該文書格納装置１０の命令受け付けモジュール３２で受け付けられる。命令受け付けモジュール３２内の文書取得部３２０は、この文書取得指示が命令受け付けモジュール３２で受け付けられると、当該文書取得指示で指定される文書名と対応付けて文書構成テーブル３１１に登録されている全てのチャンク群の識別子Ｈxを取得する（ステップ８０１）。取得されたチャンク群の識別子Ｈxの並び順は、前述したように、対応する文書におけるチャンク群の並びに一致する。
【００８１】
文書取得部３２０は、文書構成テーブル３１１から識別子Ｈxの群を取得すると、当該識別子Ｈxの群とそれぞれ対応付けてチャンク一覧テーブル３１２に登録されているチャンクＣxの群を取得する（ステップ８０２）。
【００８２】
文書取得部３２０は、チャンク一覧テーブル３１２から取得したチャンクＣxの群に基づき、当該チャンクＣxの群の並び順が、先に取得した当該チャンクＣxの群の識別子Ｈxの並び順に一致するように、クライアント装置２０からの文書取得指示で指定された文書名の文書のデータを再構成する（ステップ８０３）。
【００８３】
命令受け付けモジュール３２は、文書取得部３２０によって再構成された文書データを、クライアント装置２０からの文書取得指示に対する応答として当該クライアント装置２０に返す（ステップ８０４）。
【００８４】
ところで、クライアント装置２０がユーザからの要求により、文書格納装置１０から文書（文書データ）上のデータ断片を取得したい場合がある。クライアント装置２０が文書格納装置１０から文書上のデータ断片を取得するための方法として、当該文書の文書名に加えて、当該データ断片の当該文書上の位置及び当該データ断片の長さを指定する方法が知られている。文書格納装置１０が、このような方法に適応するためには、クライアント装置２０によって指定された文書名の文書の文書データを上述のように再構成した上で、当該文書データからクライアント装置２０によって指定された位置・長さのデータ断片を取得する必要がある。
【００８５】
そこで、例えば前述のチャンク登録処理で指定の文書名に対応付けてチャンクＣの識別子ＨCを文書構成テーブル３１１に登録する際に、当該チャンクＣの対応する文書データ上での位置・長さを示す情報を当該チャンクＣの識別子ＨCに付加するとよい。このようにすると、この情報を参照して、この情報が付加されている識別子に対応付けてチャンク一覧テーブル３１２に保持されているチャンクを特定するだけで、指定の文書上の指定の位置・長さのデータ断片を取得することができる。
【００８６】
＜本実施形態のまとめ＞
本実施形態によれば、可変長重複排除に関する従来の技術で必要であった、チャンクの切り出し点を求めるための識別子の計算と、重複検出に利用するたのチャンク自体の識別子の計算とを統合することができ、これにより、より高速に可変長重複排除を行うことができる。
【００８７】
［変形例］
次に上記実施形態の変形例について説明する。  
上記実施形態では、チャンクの切り出し点を定めるときの判定に、「仮チャンクＣ’の識別子ＨC’の下位ｍビットが予め定められた値Ａと一致する」という判定条件が適用されている。しかし、これ以外の判定条件を用いることも可能である。
【００８８】
本変形例の特徴は、切り出し点決定部３３３がチャンクの切り出し点を定めるときの判定に、次の判定条件を適用することを特徴とする。この判定条件とは、「仮チャンクＣ’の識別子ＨC’の下位ｍビットが、当該仮チャンクＣ’の末尾ｍビットの値と一致する」ことである。本変形例によれば、次の効果が期待できる。この効果とは、条件判定の対象となる値、つまり仮チャンクＣ’の末尾ｍビットの値が予め定められた固定値ではないことから、ハッシュ関数の特性や入力データの特性により仮チャンクＣ’の識別子（ハッシュ値）ＨC’の下位ｍビットの値に偏りがあったとしても、一致箇所（条件一致）の偏りが平準化されることである。
【００８９】
以下、本変形例で適用される、文書格納装置１０における文書格納処理について、上記実施形態と相違する点を中心に図９のフローチャートを参照して説明する。なお、図９において、図４のフローチャートと等価な処理ステップには同一参照符号を付してある。
【００９０】
本変形例で適用される文書格納処理が、上記実施形態で適用される文書格納処理と相違する点は、ステップ４０５で、「Ｏe’−Ｏs」の値、つまり仮チャンクＣ’の区間の長さがＬmax未満であると判定された場合である。この場合、切り出し点決定部３３３は、識別子生成部３３１によって生成された識別子ＨC’の一部または全部の値が、仮チャンクＣ’の一部または全部の値に一致するかを判定する（ステップ４０６ａ）。ここでは、識別子ＨC’の下位ｍビットの値が、仮チャンクＣ’の末尾のｍビットの値に一致するかが判定されるものとする。
【００９１】
もし、識別子ＨC’の下位ｍビットの値が仮チャンクＣ’の末尾のｍビットの値に一致するならば（ステップ４０６ａのＹｅｓ）、上記実施形態におけるステップ４０６の判定がＹｅｓの場合と同様に、切り出し点決定部３３３によってステップ４０８の判定処理が行われる。これに対し、識別子ＨC’の下位ｍビットの値が仮チャンクＣ’の末尾のｍビットの値に一致しないならば（ステップ４０６ａのＮｏ）、上記実施形態におけるステップ４０６の判定がＮｏの場合と同様に、仮チャンク区間設定部３３２によってステップ４０７が実行されて、仮チャンクＣ’の区間が終端側に１バイトだけ拡張される。
【００９２】
次に、本変形例におけるチャンク切り出し点を設定する動作の具体例について、図１０を参照して説明する。図１０はチャンク切り出し点を設定する動作の過程の一例を示す。
【００９３】
図１０の例では、仮チャンクＣ’の識別子ＨC’の下位２ビット（ｍ＝２）の値が、当該仮チャンクＣ’の末尾の２ビットの値に一致したときに、当該仮チャンクＣ’の終了オフセットである仮終了オフセットＯe’が、チャンクＣの終了オフセットＯeと決定される。このチャンクＣの終了オフセットＯeは、例えば次のように決定される。ここで、仮チャンクＣ’の識別子（ハッシュ値）ＨC’の計算に用いられるハッシュ関数をｈγ( )のように表す。
【００９４】
文書データ“The fil…”における仮チャンクＣ’が仮チャンク“Th”であり、当該仮チャンク“Th”の識別子ｈγ(“Th”)が０ｘＤＤであるものとする。この識別子０ｘＤＤの下位２ビットは０ｘ０１である。この識別子０ｘＤＤの下位２ビットは、当該識別子０ｘＤＤとマスクデータ０ｘ０３との論理積演算０ｘＤＤ＆０ｘ０３によって求められる。一方、仮チャンク“Th”の末尾の１文字“h”は０ｘ６８であり、この“h”＝０ｘ６８の下位２ビット、つまり仮チャンク“Th”の末尾の２ビットは０ｘ００である。この仮チャンク“Th”の末尾の２ビットは、“h”＝０ｘ６８とマスクデータ０ｘ０３との論理積演算“０ｘ６８＆０ｘ０３”によって求められる。仮チャンク“Th”の識別子０ｘＤＤの下位２ビット０ｘ０１は、当該仮チャンク“Th”の末尾の２ビット０ｘ００に一致しない。このため、仮チャンクＣ’の区間は、文書データ“The fil…”の末尾側に１（１バイト）だけ広げられる。
【００９５】
すると仮チャンクＣ’は、仮チャンク“The”となる。仮チャンク“The”の識別子ｈγ(“The”)が０ｘ１２であるものとする。この識別子０ｘ１２の下位２ビットは０ｘ０２である。一方、仮チャンク“The”の末尾の１文字“e”は０ｘ６５であり、この“e”＝０ｘ６５の下位２ビット、つまり仮チャンク“The”の末尾の２ビットは０ｘ０１である。仮チャンク“The”の識別子０ｘ１２の下位２ビット０ｘ０２は、当該仮チャンク“The”の末尾の２ビット０ｘ０１に一致しない。このため、仮チャンクＣ’の区間は、文書データ“The fil…”の末尾側に１だけ広げられる。
【００９６】
すると仮チャンクＣ’は、仮チャンク“The ”となる。仮チャンク“The ”の識別子ｈγ(“The ”)が０ｘ３Ｅであるものとする。この識別子０ｘ３Ｅの下位２ビットは０ｘ０２である。一方、仮チャンク“The ”の末尾の１文字（スペース文字）“ ”は０ｘ６０であり、この“ ”＝０ｘ６０の下位２ビット、つまり仮チャンク“The ”の末尾の２ビットは０ｘ００である。仮チャンク“The ”の識別子０ｘ３Ｅの下位２ビット０ｘ０２は、当該仮チャンク“The ”の末尾の２ビット０ｘ００に一致しない。このため、仮チャンクＣ’の区間は、文書データ“The fil…”の末尾側に１だけ広げられる。
【００９７】
すると仮チャンクＣ’は、仮チャンク“The f”となる。仮チャンク“The f”の識別子ｈγ(“The f”)が０ｘＡ２であるものとする。この識別子０ｘＡ２の下位２ビットは０ｘ０２である。一方、仮チャンク“The f”の末尾の１文字“f”は０ｘ６６であり、この“f”＝０ｘ６６の下位２ビット、つまり仮チャンク“The f”の末尾の２ビットは０ｘ０２である。仮チャンク“The f”の識別子０ｘＡ２の下位２ビット０ｘ０２は、当該仮チャンク“The f”の末尾の２ビット０ｘ０２に一致する。したがって、仮チャンク“The f”の終端位置（仮終了オフセット）が切り出し点として決定される。
【００９８】
＜本変形例のまとめ＞
本変形例によれば、上記実施形態と同様に、可変長重複排除に関する従来の技術で必要であった、チャンクの切り出し点を求めるための識別子の計算と、重複検出に利用するたのチャンク自体の識別子の計算とを統合することができ、これにより、より高速に可変長重複排除を行うことができる。しかも本変形例によれば、チャンクの切り出し点を定める際の条件判定の対象となる値として、仮チャンクＣ’の末尾ｍビットの値が用いられることから、ハッシュ関数の特性や入力データの特性により仮チャンクＣ’の識別子ＨC’の下位ｍビットの値に偏りがあったとしても、一致箇所の偏りが平準化される
なお、本発明は、上記実施形態またはその変形例そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態またはその変形例に開示されている複数の構成要素の適宜な組み合わせにより種々の発明を形成できる。例えば、実施形態またはその変形例に示される全構成要素から幾つかの構成要素を削除してもよい。
【符号の説明】
【００９９】
１０…文書格納装置、２０…クライアント装置、３０…ネットワーク、３１…文書格納部、３２…命令受け付けモジュール、３３…可変長重複排除モジュール、３４…作業用メモリ、３１１…文書構成テーブル、３１２…チャンク一覧テーブル、３２０…文書取得部、３３１…識別子生成部、３３２…仮チャンク区間設定部、３３３…切り出し点決定部、３３４…チャンク登録部、３４１…文書バッファ、３４２…レジスタ部。
【図１】
2011065268.tif 000003
【図２】
2011065268.tif 000004
【図３】
2011065268.tif 000005
【図４】
2011065268.tif 000006
【図５】
2011065268.tif 000007
【図６】
2011065268.tif 000008
【図７】
2011065268.tif 000009
【図８】
2011065268.tif 000010
【図９】
2011065268.tif 000011
【図１０】
2011065268.tif 000012
【図１１】
2011065268.tif 000013
【図１２】
2011065268.tif 000014
【図１３】
2011065268.tif 000015
【図１４】
2011065268.tif 000016