データ・クラスタを使用する冗長性の少ないデータを格納する方法
本明細書は、冗長性の少ない形式でデータを格納するための方法および装置を記載する。バイナリ・ラージ・オブジェクト(BLOB)は、分割方法に従ってサブブロックに分割され、サブブロックはサブブロック・クラスタに格納される。各BLOBは、クラスタ内のサブブロックの隣接シーケンスを識別するサブブロックのスパンのリストとして表示される。記憶装置の冗長性は低減することができる。何故なら、2つの異なるBLOBのスパンは同じサブブロックを参照することができるからである。サブブロック・ハッシュをサブブロック・クラスタ番号にマッピングするためにインデックスを使用することができる。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータ・システムにおいて記憶空間が少なくてすむ形式でデータを格納する方法および装置に関する。
【背景技術】
【0002】
従来のコンピュータ記憶システムは、通常、ファイル・システム内に名前付きファイルとしてバイトのシーケンスを格納している。多くのファイルは相互に非常に似ている場合があり、データの大部分130、132を共有している場合がある(図13)のに、これらのシステムはこの冗長性を除去することができない。それどころか、これらのシステムは、同じデータの多数のコピー130、132を保持しながら各ファイル140、142を別々に格納していることもある(図14)。
【0003】
従来のファイル・システムの中には、個々のファイルを圧縮するために、(GZipのような)従来の損失を起こさないテキスト圧縮アルゴリズムを組み込んでいるものがあるが、これは「鍵穴」冗長除去技術と見なすことができる。何故なら、この技術は、ファイル・システムを全体として分析するのではなく、ある時点で1つのファイルの冗長性を分析するからである。これらの従来のテキスト圧縮アルゴリズムは、ファイル・システムの異なる部分の2つの類似しているファイル130、132のような遠く離れているデータ150、152間の類似性を見つけることができない場合がある(図15)。
【発明の開示】
【発明が解決しようとする課題】
【0004】
そこで、データのその反復シーケンスのいくつかを識別し、格納しているこの反復データのコピーの数を低減することができる形式でデータを表示する方法および装置が求められている。
【課題を解決するための手段】
【0005】
データの反復シーケンスのコピーの数を低減するような方法で、いくつかの異なるバイナリ・ラージ・オブジェクト(BLOB)10、12を表示するために、2つ以上のBLOB表示により各反復シーケンスを参照することができる表示を使用することができる。図16は、このことを達成することができる1つの方法を示す。この実施形態の場合には、各BLOB160、162はサブブロックと呼ばれる部分A、B、C、D、E、F、Gに分割され、サブブロックの複製164、166は識別され、1回だけ格納される。このフレームワークにおいては、下記の問題が解決される。すなわち、BLOBをサブ分割する方法、結果として得られるサブブロックを格納する方法、およびサブブロックの複製を識別するための方法。
【0006】
本発明のある態様によれば、格納するデータの各BLOB10、12は、分割方法によりサブブロックA〜Jに分割される(図1)。種々の分割方法を使用することができるが、特に、データを固定長のサブブロック60〜65に分割する固定長分割方法を使用することもできるし(図6)、またはデータ自身により定めた位置で(図1)、データを可変長のサブブロックE、F、G、A、B、C、Dに分割する可変長分割方法を使用することもできる(図10)。本発明者と同じ発明者であるWilliamsの米国特許第5,990,810号に、この後者の方法の一例が開示されている。この米国特許は、参照により本明細書に組み込まれ、図37に示す。
【0007】
サブブロックは、冗長除去の単位になり、ある実施形態の場合には、システムは、せいぜい一度だけ一意の各サブブロックを格納する。他の実施形態の場合には、一意の各サブブロックのコピーの数は低減するが、2以上の場合がある。
【0008】
例示的実施形態の場合には、BLOBのサブブロックは、サブブロック・クラスタ20、22、24と呼ばれるグループ内に格納される(図2)。各BLOBは、それぞれが1つのクラスタ20、22、24内のサブブロックの隣接シーケンスを識別するレコード(「スパン・レコード」)30、31、32の順序付きリスト(またはツリー)により表示することができる(図3および図4)。BLOB10は、スパン30、31、32のリストにより識別されたシーケンスの連結として表示することができ(図3および図4)、各スパンが参照したサブブロック内のサブブロック・コンテンツを検索するスパンのBLOBのリストを順次チェックすることにより、記憶装置から検索することができる。
【0009】
例示的実施形態においては、クラスタ20、22、24は、2つ以上のBLOB XおよびYからのサブブロックを含むこともできるし(図4)、BLOBのサブブロックは、2つ以上のクラスタ内に常駐することもできる(図3)。例示的実施形態において、BLOBのサブブロックを1つまたは複数のクラスタ内に順次格納することができる(図2)。これによりBLOB検索の効率が改善される。何故なら、BLOB内のサブブロックの全シーケンスを、1回の順次読出動作でディスクから読み出すことができるからである。このことは、各サブブロックを探してランダム・アクセス・ディスク・シークを行うよりも遥かに効率的である。
【0010】
例示的実施形態においては、同じまたは異なるBLOB内の異なるスパンは、同じサブブロックを含む(図4)。これにより冗長性を低減することができる。何故なら、同じサブブロックを含むBLOBは、(クラスタ内の)同じサブブロックを指すスパンにより表示することができるからである。
【0011】
本発明のさらに他の態様によれば、各クラスタは、クラスタが使用するスペースの大きさを低減するためにデータ圧縮方法により圧縮される。これを行う最も簡単な方法は、全クラスタを圧縮することである。いくつかの実施形態(特に大きなクラスタを使用する実施形態の場合には)においては、全クラスタ(またはサブブロックを読み出す前のクラスタの少なくとも一部)を圧縮解除しなくても、クラスタ内のサブブロックにアクセスすることができるように、クラスタの各部分(例えば、個々のサブブロックまたはサブブロックの一続きの部分)を圧縮することが望ましい場合がある。
【0012】
本発明のさらに他の態様によれば、各クラスタ内のサブブロックのディレクトリ70が各クラスタに対して生成され、(通常は開始のところの)クラスタ内に格納されるか(図7)、または別々に80、82(図8)内に格納される。ディレクトリは、例えば、サブブロックの前に各サブブロックのメタデータを格納することにより、クラスタ全体に分配することもできる(図9)。ディレクトリは、そのハッシュ、長さ、サブブロック識別子、およびクラスタ内のその位置のような、各サブブロックに対する種々のメタデータを含むことができる。
【0013】
本発明のさらに他の態様によれば、2つ以上のBLOBが共有するサブブロックが識別される。例示的実施形態においては、サブブロックのコンテンツまたはサブブロック・ハッシュ(サブブロックのコンテンツのハッシュ)をクラスタ52、54、56にマッピングする(または関連付ける)サブブロック・インデックス50が維持される。格納動作中、格納される各サブブロックが、サブブロック・インデックス内で参照される。存在する場合には、サブブロックは再度格納されない。サブブロックが存在しない場合には、サブブロックはクラスタ内に格納され、それに対するエントリがサブブロック・インデックスに追加される。いずれの場合も、新しいサブブロックがスパン58により参照される。
【0014】
本発明のある態様によれば、特定のサブブロックが記憶装置内にすでに存在していることをインデックスが示す場合には、一致するサブブロックのクラスタがアクセスされ、クラスタ内の一致するサブブロックの後のサブブロックが、格納するBLOB内の一致するサブブロックの後のサブブロックと比較される(図10)。この比較はインデックスにアクセスしないで行うことができ、実際には、サブブロックを含んでいるクラスタが、サブブロック・ハッシュを含むサブブロック・ディレクトリを有している限り、実際のサブブロック・コンテンツ・データにアクセスしないで行うことができる。
用語
欠落サブブロック:記憶装置内に存在していないサブブロック
BLOB(バイナリ・ラージ・オブジェクト):データのゼロまたはそれ以上のバイト(またはビット)の有限シーケンス。その名前にも関わらず、BLOBは必ずしも大きくはない。BLOBは、数ビットまたはバイトのように小さいものであってもよいし、またはギガバイトのように大きいものであってもよい。
【0015】
BLOBレコード:特定のBLOBについての情報を記録している記憶装置内に維持されているレコード。また、BLOBレコードは、BLOBコンテンツを定義するスパンのリスト(またはツリー)を含むこともできるし、または参照することもできる。
【0016】
BLOBテーブル:BLOB識別子(例えば、制限なしに、BLOBハッシュ)をBLOBレコードに関連付けるデータ構造
クラスタ:「サブブロック・クラスタ」の短縮語。関連するサブブロックのグループ。クラスタは、クラスタ内のサブブロックについての情報を提供する関連サブブロック・ディレクトリを有することができる。
【0017】
クラスタ・サブブロック・ディレクトリ:クラスタ内のサブブロックについての情報を提供するメタデータの集合体。サブブロックのメタデータは、サブブロックの長さ、ハッシュ、識別子および基準カウントを含むことができる(しかし、含むことができるものはこれらに限定されない)。
【0018】
隣接する:物事の順序付きグループ内の2つの物事が隣り合っている場合には、隣接するという。Nの物事が正確にN−1の隣り合った1対の物事を含んでいる場合には(すなわち、Nの物事が1つの連続している一続きの部分として表される場合には)、物事の順序付きグループ内のNという物事は隣接している。
【0019】
隣接サブブロック:隣り合っている場合には、あるコンテキスト(例えば、BLOBまたはクラスタ)において、2つのサブブロックは隣接している。Nという物事が正確にN−1の隣り合った1対のサブブロックを含んでいる場合には(すなわち、サブブロックが1つの連続している一続きの部分となっている場合には)、あるコンテキストにおいてNのサブブロックは隣接している。
【0020】
ディレクトリ:クラスタ・サブブロック・ディレクトリ参照
ディスク:コンピュータが使用するランダム・アクセス記憶媒体。通常、ディスクという用語は、磁化したデータを保持している金属の回転円盤(ハードディスク)を意味する。本明細書においては、ディスクという用語は、メモリよりかなり遅いランダム・アクセス記憶媒体を意味するようにもっと広義に解釈することができる。
【0021】
固定長分割方法:データを固定長サブブロックに分割するデータを分割するための方法。例えば、固定長分割方法は、BLOBを512バイトのサブブロックに分割することができる。
【0022】
ハッシュ:ハッシュ・アルゴリズムが生成したバイト(またはビット)の固定長シーケンス。サブブロックのハッシュは、サブブロックを索引し、比較するためのサブブロックを表すものとして使用することができる。
【0023】
ハッシュ・アルゴリズム:バイト(またはビット)の有限シーケンスを受け入れ、入力シーケンスに高度に依存するバイト(またはビット)の有限シーケンスを生成するアルゴリズム。通常、ハッシュ・アルゴリズムは、特定の固定長の出力を生成する。ハッシュ・アルゴリズムは、シーケンスを直接比較しなくても、データの2つのシーケンスが同じであるか否かをチェックするための試験に使用することができる。実際に暗号化ハッシュを使用すれば、そのハッシュが同じである場合、2つのサブブロックが同じであると結論することができる。ハッシュ・アルゴリズムは、BLOB識別子を生成し、サブブロックを比較し、ハッシュ・テーブル・キーを生成するために、例示的実施形態において使用することができる。
【0024】
サブブロックのハッシュ:サブブロック・ハッシュ参照
インデックス:サブブロック・インデックス参照
インデックス・バケット:ハッシュ・テーブルを使用してサブブロック・インデックスを実施する実施形態の場合には、ハッシュ・テーブルを、それぞれが空であるかエントリを含み、それぞれが一定数のエントリ・スロットを含むバケットのアレイとして構成することができる。インデックス・バケットの1つの目的は、ハッシュ・テーブルを、ランダム・アクセス・ディスク動作の回数を低減するために、グループとしてディスクから読み出し、ディスクに書き込むことができる部分に構成することである。
インデックス・エントリ:サブブロック・インデックス内のレコード。ある実施形態の場合には、インデックス・レコードは、インデックス・キーおよびインデックス値を含む。ある実施形態の場合には、インデックス・レコードは、インデックス・キーの一部およびインデックス値を含む。ある実施形態の場合には、インデックス・レコードはインデックス値だけを含む。ある実施形態の場合には、インデックス・レコードは値を含まないで、キーの一部または全部を含む。
【0025】
インデックス・キー:サブブロックについての情報を検索するために、サブブロック・インデックスに提供されるサブブロックについての情報。ある実施形態の場合には、この情報はインデックス・エントリの位置を発見し、読み出すことにより検索される。
【0026】
インデックス値:サブブロック(またはその一例がそのハッシュであるサブブロックの派生物)をインデックスで参照した場合に、インデックスによりサブブロックについて生成された情報。ある実施形態の場合には、この値は、ディスク上のサブブロックの位置からなる。他の実施形態の場合には、インデックスの唯一の目的がキーの有無を記録することである場合には、値が存在しない場合がある。ある実施形態の場合には、この値は単にクラスタ数からなる。
【0027】
サブブロックの長さ:サブブロック・コンテンツ内のバイト(またはビット)数
線形探索:1つずつ集合体内のオブジェクトをチェックすることによる、およびチェックする次のオブジェクトの選択が前のチェックの結果により影響を受けない場合の、オブジェクトの集合体内の1つのオブジェクトに対する探索方法。
スパンのリスト:スパンの順序付きリスト。このようなリストは、BLOBのコンテンツを表示するために使用することができる。
【0028】
一致する一続きの部分:(例えば、格納しているBLOB内に存在してもよい)サブブロックの他のシーケンスと一致する(クラスタ内の)サブブロックのシーケンス。ある実施形態の場合には、サブブロックのシーケンスは隣接している。
【0029】
メモリ:通常、ランダム・アクセス・メモリ(RAM)を参照するコンピュータが使用するランダム・アクセス記憶媒体。本明細書においては、この用語は、「ディスク」よりかなり速いランダム・アクセス記憶媒体を意味するようにもっと広義に解釈することができる。
【0030】
分割方法:BLOB内の各バイト(またはビット)が、正確に1つのサブブロック内に入るように、BLOBを1つまたは複数のサブブロックに分割するための方法。
【0031】
存在サブブロック:記憶装置内に存在するサブブロック。
【0032】
低冗長:バイト(またはビット)の同一シーケンスのコピー数の任意のタイプのデータ表示での低減である。
【0033】
低冗長記憶装置:データのその表示の際に、自身が格納している一組のデータ内の複製データのいくつかを除去する記憶システム。
【0034】
サブブロックへの参照:サブブロックを識別する1つのデータ。例えば、制限なしで、参照は、コンテンツまたは格納位置によりサブブロックを識別することができる。
【0035】
基準計数:あるエンティティがもはや必要なくなった時を判定するための方法。この方法は、エンティティに対して存在する参照の数を記録するカウンタを維持するステップを含む。基準カウントがゼロになった場合には、エンティティを削除することができる。ある実施形態の場合には、BLOBおよび/またはサブブロックは基準カウントを有する。
【0036】
スパン:クラスタ内のサブブロックのシーケンス。ある実施形態の場合には、このシーケンスは隣接している。
【0037】
スパン・レコード:クラスタ内のスパンを識別するレコード。ある実施形態の場合には、スパン・レコードは、クラスタ番号フィールド、開始サブブロック識別子フィールド、および(サブブロックまたはバイトの)スパン長フィールドを含む。
【0038】
記憶装置:低冗長記憶装置参照。
【0039】
サブブロック:索引、比較および/または冗長除去のための単位として識別されたバイト(またはビット)のシーケンス。BLOBはサブブロックに分割することができる。
【0040】
サブブロック・クラスタ:一緒に格納している1つまたは複数のサブブロックのグループ。「クラスタ」とも呼ばれる。
【0041】
サブブロック・コンテンツ:サブブロックのメタデータとは異なるサブブロックの実際のデータ。
【0042】
サブブロック・ディレクトリ:クラスタ・サブブロック・ディレクトリ参照。
【0043】
サブブロック満了日:サブブロックをユーザが必要としないことを保証された場合に、最も初期の日付を定義するサブブロックと関連する1つのメタデータ。
【0044】
サブブロック・ハッシュ:サブブロックへのハッシュ・アルゴリズムの適用結果。サブブロックのハッシュは、例えば、サブブロックを索引および/または比較するために、サブブロックを表すものとして使用することができる。
【0045】
サブブロック識別子:サブブロックに関連する1つのメタデータ。識別子はクラスタ内のサブブロックに対して一意のものであり、それ故、そのクラスタ内のサブブロックを一義的に識別するために使用することができる。ある実施形態の場合には、異なるクラスタ内のサブブロックは、同じ識別子を有することができる。
【0046】
サブブロック・インデックス:サブブロックの位置(例えば、制限なしで、クラスタ番号(およびまた、おそらくサブブロック識別子))に、サブブロックのハッシュ(またはサブブロック自身)をマッピングする(または他の方法で関連付ける)データ構造。
【0047】
サブブロック・メタデータ:サブブロックについての情報。サブブロックのメタデータは、(制限なしに)サブブロックの長さ、サブブロックのハッシュ、サブブロックの識別子、サブブロックの満期日付、およびサブブロックの基準カウントを含むことができる。
【0048】
サブブロック・レコード:1つのサブブロックに対するメタデータを含むクラスタ・サブブロック・ディレクトリ内のレコード。
【0049】
サブブロック基準カウント:サブブロックに対する参照の現在数を記録する1つのサブブロック・メタデータ。ある実施形態の場合には、これはサブブロックを含むスパンを定義するスパン・レコードの数である。
【0050】
サブブロック一連番号:サブブロック識別子の形式。例えば、一連番号システムを使用するある実施形態の場合には、特定のクラスタに到着するサブブロックには、第1のサブブロックに対して1から始まり増大する一連番号が割り当てられる。ある実施形態の場合には、サブブロックを削除した場合には、一連番号は再使用されない。これらの実施形態の場合には、一連番号は、クラスタ内のサブブロックを一意に識別する方法を提供する。
【0051】
ユーザ:記憶装置内にBLOBを格納し、検索する1つのソフトウェア。
【0052】
可変長分割方法:BLOBを可変長サブブロックに分割する分割方法。好ましい実施形態の場合には、可変長分割方法は、データをデータのコンテンツが決定する境界のところで分割する。例えば、制限なしに、分割方法は、前のいくつかのバイトが、特定の所定の一定値にハッシュするBLOB内の各位置のところのサブブロック境界を定義することができる。
【0053】
仮想ブロック装置:オペレーティング・システムが提供する固定長記憶ブロックのアレイからなる装置。仮想装置は、物理デバイスに直接対応することができ、または(例えば、RAIDを使用して)1つまたは複数の物理デバイスから構成することができる。
【0054】
全キー:小さな派生キーの元として使用されるキー。データ構造が成長し、派生キーが必要になるので、全キーの増大する部分を、派生キーを形成するのに使用することができる。
【0055】
本明細書全体および添付の特許請求の範囲を通して、別段の指示がない限り、「備える」および「含む」という用語、および「備えている」および「含んでいる」という派生語は、「包含」および「除外しないこと」を意味する用語であると理解されたい。例えば、このような用語を記載の整数または整数のグループを参照するために使用した場合には、このような用語は、任意の他の整数または整数のグループの除外を意味しない。
【0056】
本明細書の添付の特許請求の範囲は、本明細書に記載する本発明の広義の記述であり、参照により本明細書に組み込まれる。
【0057】
本明細書での任意の従来技術への参照は、このような従来技術が共通の一般的知識の一部を形成しているという容認でもなければ、任意の形式の示唆でもないし、またそのように解釈すべきでもない。
【0058】
添付の図面を参照しながら、以下に本発明の特定の実施形態についてさらに詳細に説明する。これらの実施形態は、説明のためのものであって、本発明の範囲を制限するためのものではない。他の実施形態の示唆および記述を本発明の範囲内に含めることができるが、これらのものは添付の図面には示していないし、または別の方法で本発明の機能を図面には示してあるが本明細書には記述していない。
【発明を実施するための最良の形態】
【0059】
図5は、本発明の典型的な実施形態の要素の概観である。この実施形態は、BLOBレコード51、53と、スパン・リスト58と、クラスタ52、54、56と、サブブロック・インデックス50とを含む。図38は、典型的なコンピュータ・ハードウェア上でのこれらの要素の配置を示す。すべてのデータ構造はディスク380上に常駐している。インデックス381も、いくつかのBLOBレコード382およびクラスタ383のいくつかの作業コピーを格納しているいくつかのキャッシュと一緒にメモリ内に保持されている。
6.1 ハッシュ関数の概観
すべての実施形態においてはハッシュ関数を使用していないが、ハッシュ関数は、多くの実施形態でいくつかの利点を提供する。下記の説明は、本発明の種々の実施形態に関連して使用することができる例示としてのハッシュ関数の概観である。
【0060】
ハッシュ関数は、ビットの可変長入力ブロックを受け入れ、入力ブロックをベースとするビットの出力ブロックを生成する。大部分のハッシュ関数は、出力ブロックが特定の長さ(例えば、16ビット)になることを保証し、入力ブロックの無限集合と出力ブロックの有限集合との間でランダムではあるが、決定論的マッピングを提供するようにする。ランダムさの特性により、「ハッシュ」と呼ばれるこれらの出力を、入力ブロックの容易に操作した表示として動作させることができる。
【0061】
ハッシュ関数は少なくとも4つのクラスの強度を有する。
【0062】
狭いハッシュ関数:狭いハッシュ関数は、最も弱いクラスのハッシュ関数であり、出力値の全スペースを妥当な時間内に探索することができるような、非常に狭い(例えば、16ビット)出力値を生成する。例えば、8ビットのハッシュ関数は、任意のデータ・ブロックを0〜255の範囲内のハッシュにマッピングする。16ビットのハッシュ関数は、0〜65535の範囲内のハッシュにマッピングする。特定のハッシュ値の場合には、単に探索する値が表れるまで、ランダム・ブロックを生成し、これらのブロックを狭いハッシュ関数に提供することにより、対応するブロックを発見することができる。狭いハッシュ関数は、一組のデータ値を少数のグループに任意に(しかし決定論的に)分類するために、通常、使用される。それ故、狭いハッシュ関数は、ハッシュ・テーブル・データ構造を構成し、ノイズの多い通信チャネルを通して送信したデータのエラーを検出するのに役に立つ。このクラスの例としては、CRC−16、CRC−32、フレッチャ・チェックサム、IPチェックサム等がある。
【0063】
広いハッシュ関数:広いハッシュ関数は、その出力値がかなり広いということを除けば、狭いハッシュ関数に類似している。ある点においては、この定量的違いは、定性的違いを意味する。広いハッシュ関数の場合には、出力値が非常に広い(例えば、128ビット)ので、同じハッシュ値を有する任意の2つのランダムに選択したブロックの確率は無視することができる(例えば、1038のうちの約1)。この特性により、これらの広いハッシュを、これらが計算されたデータのブロックの「ID(identity)」として使用することができる。例えば、エンティティE1がデータのブロックを有し、エンティティE2にブロックの広いハッシュを送った場合で、エンティティE2が同じハッシュを有するブロックを有している場合には、ブロックが実際に異なる先験的確率は無視することができる。唯一の問題は、広いハッシュ関数が非反転できるように設計されていないことである。それ故、(例えば)2128値のスペースは、狭いハッシュ関数のところで説明した方法で探索するにはあまりに広すぎるが、ハッシュ関数を分析し、特定のハッシュに対応するブロックを計算するのは容易である。それ故、E1が本当に異なるブロックである場合には、E1は、E2がE1が1つのブロックを有すると思い込ませることができる。このクラスの例としては、任意の128ビットのCRCアルゴリズムがある。
【0064】
弱一方向ハッシュ関数:弱一方向ハッシュ関数は、「ID」を提供するのに十分広いばかりでなく、特定のハッシュ値が与えられた場合、そのハッシュ値に対応するブロックを発見するのが極度に難しい暗号保証を提供する。このクラスの例としては、64ビットDESハッシュがある。
【0065】
強一方向ハッシュ関数:強一方向ハッシュ関数は、同じハッシュ値を有する任意の2つの異なるブロックを発見するのが難しい暗号保証を提供する追加特性を有することを除けば、弱一方向ハッシュ関数と同じものである。この場合、ハッシュ値は指定されない。このクラスの例としては、MD5およびSHA−1がある。
【0066】
これら4つのクラスのハッシュは、選択が行われるある範囲のハッシュ強度を提供する。予想されるように、ハッシュ関数の速度は、強度が増大するにつれて低減し、トレードオフを提供し、異なる用途の場合には異なる強度が適切な強度になる。しかし、違いは非常に小さいので、最もタイムクリティカルな用途以外では、強一方向ハッシュ関数を使用することができる。
【0067】
暗号ハッシュという用語は、多くの場合、弱一方向ハッシュ関数のクラスおよび強一方向ハッシュ関数のクラス両方を含む暗号強度を提供するハッシュを指すために使用される。
【0068】
本発明の例示的実施形態は、少なくとも2つの役割でハッシュ関数を使用することができる。
【0069】
1.サブブロック境界を決定するために。
【0070】
2.サブブロックIDを生成するために。
【0071】
用途に従って、上記4つのクラスのうちの任意のクラスからのハッシュ関数をいずれかの役割で使用することができる。しかし、サブブロック境界の決定にはIDおよび暗号強度が必要ないので、最も弱いクラス以外からのクラスからのハッシュ関数を使用するのは非効率である。同様に、IDの必要性、絶えず存在する破壊行為の脅威、および強一方向ハッシュ関数(弱一方向ハッシュ関数と比較した場合)に対する低性能というペナルティは、強一方向ハッシュ関数より弱いいかなるものもサブブロックIDの計算に使用すべきではないことを示唆している。
【0072】
IDを生成するために強一方向ハッシュ関数以下の何かを使用する際につきもののセキュリティの危険は、任意のこのような弱ハッシュ関数を使用する本発明を組み込む記憶システムを考慮することにより説明することができる。このようなシステムにおいては、侵入者は、修正したサブブロックが、ターゲット・システム内にすでに存在することを侵入者が知っている他のサブブロックと同じハッシュを有するように、(ターゲット・システムにより操作される)サブブロックを修正することができる。そうすると、ターゲット・システムがそれを新しいものと置き換えないで、既存のサブブロックを保持する結果になる恐れがある。(例えば)ターゲット・システムがネットワーク上で検索したセキュリティ・パッチを正しく適用するのを防止するために、このような弱点を使用することができる。
【0073】
それ故、敵意を持つ人間に曝されないシステムでサブブロックを計算するのに、広いハッシュ関数を安全に使用することができるが、弱一方向ハッシュ関数が、これらのシステムでは非セキュアとなる恐れがある。
【0074】
ここで、ブロックまたはサブブロックのハッシュを実際に使用することができる方法について説明する。
6.2 暗号ハッシュの使用
暗号ハッシュ(およびここでは強一方向ハッシュ関数)の理論特性は、特に興味のある実際の特性を生成する。このようなハッシュはかなり広いので、2つのランダムに選択したサブブロックが、同じハッシュを有する確率は事実上ゼロであり(128ビット・ハッシュの場合には、1038のうちの約1であり)、同じハッシュを有する2つのサブブロックを発見するのは計算上不可能であるので、スパイがそのようなことを行うことができないことを事実上保証している。これらの特性の密接な関係は、実際の見地から見ると、特定の暗号ハッシュ・アルゴリズムに対するハッシュ値の有限集合は、有限の可変長サブブロックの無限集合に対して1対1の関係になる。これは、同じ値にハッシュする2つのサブブロックを発見するのは実際上不可能であるので、実際には、理論上不可能な特性であることは明らかである。
【0075】
この特性は、(同一であることのために)比較の目的で、計算されたサブブロックの代わりに、暗号ハッシュを安全に使用することができることを意味する。大部分の暗号ハッシュは約128ビットの長さしかないので、ハッシュは、サブブロック自身のコンテンツを直接比較しなくても、サブブロックを比較するための非常に効率的な方法を提供する。
【0076】
本発明の例示的実施形態で暗号ハッシュが使用されるいくつかの方法は下記の通りである。
【0077】
サブブロックの比較:暗号ハッシュHは、2つのサブブロックA、Bのコンテンツを比較しなくても、またはアクセスしなくても、2つのサブブロックA、Bを比較280するために使用することができる(図28)。
【0078】
サブブロックのインデックス:サブブロックA、B、C、Dの集合体を索引するために、そのキーがサブブロック292、294、296、298のハッシュであるインデックス290を構成することができる(図29)。
BLOBチェック:BLOB300のサブブロック302への分割、および再構成したBLOB304へのサブブロックの以降の再組立を確実にエラーのないものにするために、暗号ハッシュを使用することができる。このことは、元のBLOBのハッシュ306を再構成したBLOBのハッシュ308と比較309することにより行うことができる(図30)。
6.3 安全ネットとしてのハッシュの使用
本発明の実施形態は、これらの実施形態を組み込む記憶システムをさらに複雑にする場合がある。このように複雑になると、潜在的にエラーが検出されない機会が多くなる。
【0079】
複雑さの主な機構は、BLOBのサブブロックへの分割であり、このようなサブブロックの以降の再組立である。BLOBをサブブロックに分割することにより、記憶システムが、サブブロックを間違って追加したり、削除したり、再配置したり、置換したり、複製したり、または何らかの他の方法で偶然のエラーのより大きなリスクに曝されたりする恐れがでてくる。
【0080】
このリスクは、サブブロックに分割される前にBLOBのハッシュ(好適には暗号ハッシュであることが好ましい)を計算し、このハッシュを全体としてBLOBに関連するエンティティと一緒に格納し、次に、格納しているハッシュを、再構成したブロックの計算したハッシュと比較することにより、低減または除去することができる。このようなチェックは、本発明を使用することによるエラーが検出されないリスクを事実上取り除く非常に強力な安全ネットを提供する(図30)。
【0081】
BLOBをチェックするもう1つの方法は、そのサブブロックのハッシュの連結をハッシュし、記憶装置からBLOBを検索した場合の値をチェックする方法である。この方法は、全体的に見てハッシュしなければならないデータが少なくてすみ、このような実施形態をより効率的にすることができるという利点を有する。
6.4 クラスタ内へのサブブロックの格納
クラスタ内にサブブロックを格納することができる方法は多数ある。「サブブロックのコンテンツ」という用語は、実際のサブブロックを形成するバイトのシーケンスを意味する。例示的実施形態においては、クラスタ74内のサブブロック72は、メタデータの介入なしで背中合わせに格納される(図7)。クラスタがそれ自身のディレクトリを持たない実施形態の場合には、背中合わせのサブブロック・コンテンツは、クラスタが含んでいなければならないすべてのものであってもよい。
【0082】
背中合わせにサブブロックを格納する利点は、サブブロックの隣接する一続きの部分を1つのシーケンシャルな動作としてクラスタから読み出すことができることであり、次に、最初に、メタデータを除去しなくても、メモリ内に保持し、1つのシーケンシャルな動作として書き出すことができることである。
【0083】
サブブロックをクラスタに分割する方法を決定するために多数の方法を使用することができる。1つの方法は、少なくともS個のサブブロックを有するまでクラスタにサブブロックを書き込む方法である。ここで、Sは所定の定数である。もう1つの方法は、少なくともMメガバイトを含むまで、クラスタにサブブロックを書き込む方法である。ここで、Mは所定の定数である。
6.5 クラスタ・サブブロック・ディレクトリ
クラスタは、クラスタ内のサブブロックについての情報を提供し、クラスタ内のサブブロックの位置を迅速に発見することができるサブブロック・ディレクトリを有することができる。
【0084】
クラスタは、ディレクトリ70を有している場合には、ディレクトリをクラスタの始めの部分(図7)またはクラスタの終わりの部分に置くことができる。もう1つの例は、サブブロック・コンテンツ92とディレクトリ90エントリをインタリーブする例である(図9)。最後に、ディレクトリ80、82は別々に格納することができる(図8)。
【0085】
1つの簡単なオプションは、クラスタ内のサブブロック数上に上部限界Lを置き、クラスタ内のサブブロック数が何であれ、カウントにLディレクトリ・エントリのアレイを加えたものとしてディレクトリを表す方法である。これにより固定長ディレクトリ80、82が出来上がり、クラスタのディレクトリを、残りのクラスタのコンテンツ84、86(すなわち、サブブロックのコンテンツ)とは別々に1つのアレイを格納することができる(図8)。
6.6 クラスタ・サブブロック・ディレクトリ内のサブブロック・メタデータ
クラスタのサブブロック・ディレクトリは、各サブブロックの長さを格納することができる。通常、各サブブロックの長さの単位はバイトである。サブブロックの長さを格納した場合には、クラスタのサブブロックのコンテンツを、境界がサブブロック間にあることを決定するために、分割方法を呼び出さなくても、サブブロックに分割することができる。
【0086】
クラスタのディレクトリは、各サブブロックのハッシュを格納することができる。例えば、ディレクトリは、クラスタ内の各サブブロックの128ビットのMD5または160ビットのSHA−1を格納することができる。各サブブロックのハッシュを格納することは役に立つ。何故なら、格納中、システムが、サブブロックXのコンテンツをサブブロックYのコンテンツと比較しなくても、新しく到着したサブブロックYがクラスタ内で発見されたことを確認することができるからである。代わりに、システムは、サブブロックYのハッシュを計算し、それを(そのクラスタのディレクトリ内で発見することができる)サブブロックXのハッシュと比較する。それ故、格納しているBLOB内のサブブロックを、記憶装置内のサブブロックのコンテンツを読み出さなくても、インデックスおよびクラスタ・ディレクトリだけを使用して、記憶装置内に存在しているか否かを試験することができる。
【0087】
また、クラスタのディレクトリは、各サブブロックに対するサブブロック識別子を格納することもできる。サブブロックの識別子は、クラスタ内の一組のサブブロック内で一意のものである。サブブロック識別子を実施する1つの簡単な方法は、固定幅(例えば、16ビット)を選択し、各クラスタ内の一連番号カウンタを割り当て、ゼロから開始し、次の整数を各サブブロックにその一連番号識別子として割り当てる方法である。カウンタが最大値に達した場合には、クラスタを新データに対して単に閉鎖することができる。別の方法としては、サブブロックをクラスタから削除した場合には、未使用の識別子を再度割り当てることができる。これはサブブロック識別子を実施する多くの方法のうちの1つの方法である。
【0088】
一連番号をサブブロック識別子として使用した場合には、その連続性をBLOB内のサブブロックの1つの一続きの部分から格納したクラスタ内のサブブロック276〜278の一続きの部分の始まりおよび終わりを示すために使用することができる。ある実施形態の場合には、このことは各格納している一続きの部分272、274の終わりのところの一連番号をスキップ(廃棄)することにより行うことができる(図27)。一連番号を使用しない場合には、クラスタ内のサブブロックの一続きの部分の(元のBLOB内のサブブロックの一続きの部分に対する)終わりを示すために、各サブブロックのメタデータに、ブール値を追加することができる。
6.7 クラスタの圧縮
システム内に圧縮(例えば、制限なしに、GZiP)を組み込むことができる方法は多数ある。1つの簡単な方法は、ディスクに書き込む前に、各クラスタに対して1つのシーケンシャルな動作として圧縮を行う方法である。もう1つの方法は、各サブブロックを個々に圧縮する方法である。もう1つの方法は、隣接する一連番号と一緒にサブブロックの各一続きの部分を圧縮する方法である。
【0089】
クラスタは、圧縮した形式でディスク上に格納することができる。また、これらのクラスタは、圧縮した形式でメモリに格納することもできる。
6.8 スパン・サブブロック−一続きの部分の識別
各スパンは、特定のクラスタ内のサブブロックの一続きの部分を識別する。例示的実施形態の場合には、スパンは、サブブロックの一続きの部分を含むクラスタを識別する情報を含む。サブブロックの一続きの部分を識別するための広い範囲の可能性がある。そのため、一続きの部分内の最初および最後のサブブロックを識別することができ、または最初(または最後)のサブブロックを識別することができ、長さを提供することができる。長さはバイト単位またはサブブロック単位で測定することができる。
【0090】
例示的実施形態のサブブロックを識別するために、スパンは、サブブロックのハッシュ(この場合、クラスタは(サブブロックのディレクトリを使用して(1つ有している場合))サブブロックを探索しなければならないが)、クラスタ(例えば、「第3のサブブロック」)内のサブブロックの位置、またはサブブロック識別子を使用することができる。
【0091】
ハッシュの幅は比較的広い。クラスタ内に(例えば)1000のサブブロックが存在する場合には、サブブロック識別子は、約10ビットの幅を有していればよいのだが、典型的なハッシュは128ビットの幅を有する。そのクラスタ内の(サブブロック単位で測定した)位置を使用すると、スペースをもっと効率的に使用することができるが、(サブブロックを含んでいるBLOBを記憶装置から削除した場合に起こるかもしれないように)サブブロックをクラスタから削除した場合、故障が起こる。これを避けるために、例示的実施形態の場合には、(クラスタ内で一意の)クラスタ内の各サブブロックに一意の識別子を割り当てることができる。この識別子は、クラスタのディレクトリ内に各サブブロックのメタデータと一緒に格納することができる。このような識別子は、(ビット単位で)十分狭いものであってもよいが、サブブロックがクラスタ内でシフトしても、サブブロックをはっきりと識別する。
【0092】
もう1つのアプローチは、そのハッシュでサブブロックを参照する方法であるが、同じクラスタ内で他のすべてのサブブロックからそのサブブロックを区別するために必要なものである。スパン・レコード内の短い固定長フィールドは、記録するハッシュのバイト数を記録するために使用することができる。この方法を使用すれば、サブブロック識別子を使用する必要がなくなるし、スパン・レコードに長いハッシュによる負担がかからなくなる。この方法を使用すれば、スパン・レコードは可変長を有することができる。この方法の1つの潜在的な問題は、クラスタに追加されるサブブロックが、既存の参照を曖昧にする恐れがあることである。この問題は、このような曖昧な参照がいつでも曖昧な参照を満たす第1のサブブロックを参照するように注意することにより解決することができる。
【0093】
もう1つの方法は、サブブロックの一連番号を使用するが、これらの一連番号をスパンにより直接参照されるサブブロックだけに割り当てる方法である。実際には、スパンの第1のサブブロックは非常に少ないので、遥かに少ない数の一連番号を格納するだけですむ。
6.9 部分サブブロックの一致
BLOB170の格納中、1つまたは複数の一致するサブブロックB、Cの一続きの部分をクラスタ174内で発見した場合には、一致しているサブブロックの一続きの部分のどちらかの側面上の一致していないサブブロックのある部分が、格納しているBLOB内の対応するサブブロックの対応部分と一致する可能性がある。図17は、格納中のBLOB170および比較しているクラスタ174を示す。インデックスを使用して、サブブロックBCの一致する一続きの部分を発見した。各側面上のサブブロックは一致しない。AはEと一致しないし、DはFと一致しない。それ故、一致する一続きの部分はちょうど2つのサブブロックの長さである。しかし、BCの一致を発見した場合、周囲のサブブロックをもっと精密なレベルで比較することができる。
【0094】
サブブロックAの終わりとサブブロックEの終わりと比較すれば、これらのサブブロックが、同じ(例えば)123バイトの接尾部を共有していることが分かる。同様に、サブブロックDの始まりをサブブロックFの始まりと比較すると、これらのサブブロックが、同じ(例えば)1045バイトの接頭部を共有していることが分かる。これらを部分サブブロックの一致と呼ぶ。
【0095】
部分サブブロックの一致を発見した場合には、多数の方法を使用することができる。図18は、スパン内の最初のサブブロックの始まりのところ、およびスパン内の最後のサブブロックの終わりのところで無視すべきバイト数を記録する余分なフィールド「開始スキップ」180および「終了スキップ」182を含むように、スパン・レコード構造を増大することができる方法を示す。もう1つの方法は、サブブロックのどちらかの終わりを延長するために、バイト数を記録する2つのフィールド「開始エクステンド」および「終了エクステンド」を使用する方法である。ある実施形態は、上記各フィールドの一方または両方の使用を選択することができる。
【0096】
サブブロックの一続きの部分内のバイトのある範囲を参照するもう1つの方法は、「終了スキップ」フィールドを、スパン内のバイトの全数である長さで置換する方法である。
6.10 フラグメンテーションの低減
格納しているBLOBがすでに格納済みの多くのサブブロックを含んでいるが、多くの異なるクラスタ全体に散乱している場合には、BLOBは、ディスク全体を指すスパンのリストの表示で終わる。要するに多数に分割される。
【0097】
一致しないサブブロックの長い一続きの部分内の1つのサブブロックが一致する場合には、ある特に不都合な形のフラグメンテーションが起こる。図19は、BLOB1 190が記憶装置内にすでに格納されていて、BLOB2 192を格納中であり、1つの一致するサブブロックCが、BLOB2内のサブブロックF〜Mの他の方法で一致しない一続きの部分内に位置するこの一例を示す。結果としては、一致するサブブロックに対する1つのスパン・レコード194がスパン・リスト196内に生成される。このタイプのフラグメンテーションは、BLOB2の検索時間を長くする傾向がある。何故なら、ランダム・ディスク・アクセスを、第1のクラスタ198および第2のクラスタ199に対して行わなければならないからである。
【0098】
ある種の実施形態は、孤立している一致サブブロックを一致していないとして処理し、これらのサブブロックを次に格納することにより、このタイプの1つの一致サブブロック・フラグメンテーションを避けることができる。図20は、余分のスペースを使用するが、BLOB2 202のフラグメンテーションを低減することにより、サブブロックCの孤立している一致を格納させるのを無視する方法を示す。この方法は、一致するサブブロックの予め定義したしきい値Tより短いすべての一致する一続きの部分を無視することにより一般化することができる。ある実施形態の場合には、1より大きいTの任意の値はフラグメンテーションを低減する傾向がある。値2も役に立つ。
6.11 BLOBテーブル
BLOBを格納する記憶システムは、そのユーザがBLOBを検索することができるように、BLOBを参照することができるようにするある方法を提供するものでなければならない。
【0099】
1つの方法は、BLOBのハッシュ110を識別子として使用する方法である(図11)。それ故、ユーザは、BLOBを記憶システムに提出し、BLOBのハッシュ(例えば、MD5ハッシュ)を書き留める。BLOBを検索するために、ハッシュを記憶システムに提出し、システムはBLOBを返送する。
【0100】
もう1つの方法は、任意の名前を各BLOBに割り当てる方法である。従来のファイル・システムはこの方法を使用する。
【0101】
どんなネーミング・スキームを採用しようとも実施しなければならない。このような実行は、本質的には、BLOB112名前空間から(スパンのリスト116を含む(または参照する)BLOBレコード114自身へのマッピングからなる(図11)。このマッピングは、デジタル探索ツリー、Bツリーおよびハッシュ・テーブルのようなすべてのタイプの従来のデータ構造を使用して行うことができる。
6.12 スパンのリストおよびツリー
BLOBテーブル112が参照する各BLOBレコード114は、BLOBの任意のメタデータを含み、スパン・レコード116の順序付きシーケンスを含んでいるかまたはポイントする(図11)。各スパン・レコードは、クラスタ内のサブブロックの(隣接する)一続きの部分を識別する。
【0102】
スパンの順序付きリスト内にスパンを維持すると、全BLOBをシーケンシャルに効率的に検索することができるが、格納しているBLOB上でランダム・アクセス読出しを行うために線形探索(またはスパン・レコードをランダムにアクセスできる場合には、二分探索)を必要とする。ランダム・アクセス読出しをスピードアップするために、BLOBのスパンをツリー構造に編成することができる。図26は、3つの分岐を含むツリーの一例である(が、任意の分岐を使用することができる)。各非葉ノードは、その子ノードが表すブロックの連結であるバイトの有限個のブロックを表す。各ノードは、その子ノードが表すブロックの長さである3つの長さを含む。各葉ノードは、クラスタ内の1つまたは複数のサブブロックのシーケンスを識別するスパン260からなる。このようなツリーが表す格納しているBLOBのバイトJ〜Kのランダム・アクセス読出しは、バイトJ〜Kを含むスパンを発見するためにツリーを下方に移動し、次にクラスタからサブブロック・コンテンツ・バイトを検索することにより行うことができる。
6.13 サブブロック・インデックス
サブブロック・インデックス(図5)を使用すれば、記憶装置内のすべてのクラスタの線形探索を行わなくても、記憶装置内に特定のサブブロックがすでに存在するか否かを判定することができる。また、インデックスは、一致するサブブロックの位置を発見する際に役に立つ情報を提供することができる。
【0103】
インデックス50は、それぞれがインデックス・キーをインデックス値に結合しているエントリの組織した集合体として表示することができる。エントリは、エントリ・レコード(それぞれがキー・フィールドおよび値フィールドからなる)として、インデックス内に明示的に、または(例えば、インデックスが、キー上に葉ノード内に値を含むバイナリ・デジタル探索ツリーとして組織されている場合には)暗黙的に格納することができる。
【0104】
インデックス・キーは、サブブロックのコンテンツであっても、サブブロックのコンテンツのハッシュであっても、またはサブブロックのコンテンツのハッシュの単なる一部であってもよい。サブブロックのコンテンツのハッシュの一部(例えば、全16バイトではなく、MD5ハッシュの最初の8バイト)だけを格納すると、時に起こる衝突を犠牲にして、インデックスのサイズを小さくすることができる。2つ以上のサブブロックが同じ部分ハッシュを有している場合には、インデックスは、両方のエントリを格納し、検索することができるものでなければならない。
【0105】
インデックス値は、記憶装置内のサブブロックの位置を発見する際に役に立つ情報でなければならない。ある極端な実施形態の場合には、この値は、クラスタ番号およびクラスタ内の特定のサブブロック(例えば、識別子、サブブロック一連番号またはサブブロック・ハッシュ)を識別する情報からなる正確な参照を提供することができる。極端な他の実施形態の場合には、インデックス値をクラスタ番号だけから構成することができる。サブブロックのクラスタ番号が分かると、存在する場合には、クラスタ内のサブブロックを発見するためにクラスタ・ディレクトリを探索することができる。インデックス内のスペースをさらに制約するために、インデックス値を、探索するのに2つ以上のクラスタを必要とするクラスタ番号の一部(例えば、クラスタ番号の最後の2つのビット)だけで構成することができる。
【0106】
選択の優れた組合わせは、インデックス・キーをサブブロック・ハッシュの頂部の8バイトとし、インデックス値をサブブロックを含むクラスタの数とする方法である。各クラスタに対するディレクトリが存在する限り、これらの選択は、インデックスのサイズを小さいままに維持し、依然として記憶装置の任意のサブブロックに高速でアクセスすることができる。
【0107】
インデックスは、デジタル探索ツリー、バイナリ・ツリー、およびハッシュ・テーブルを含む種々のデータ構造により行うことができる。
6.14 インデックスの格納
インデックスは、メモリ内またはディスク上に格納することができる。インデックスのサイズの低減は、インデックスがメモリ内に保持されている場合には重要な問題である。実験の結果、ある実施形態の場合には、インデックスがメモリ内に保持されている場合には、システムの動作が遥かに速くなることが分かっている。クラスタ内の目標のサブブロックの位置を識別する情報を格納しなくてすむならば、インデックスのサイズをかなり低減することができる。それ故、典型的な実施形態の場合には、インデックス内にクラスタ番号だけを格納する。
6.15 サブブロック・インデックスのためのハッシュ・テーブルの使用
サブブロック・インデックスは、低冗長記憶システムの速度を判定する際に非常に重要なものであるので、このデータ構造を最高速でアクセスできるように設計するのは重要なことである。ハッシュ・テーブルは、0(1)時間内にアクセスを提供するので、ハッシュ・テーブルは、サブブロック・インデックスに対して非常に優れたデータ構造を提供する。しかし、このハッシュ速度アクセスは、かなり高いものにつく。以下のいくつかの節は、サブブロック・インデックスが提起する課題について説明する。
6.16 ハッシュ・テーブルの衝突
この節においては、ハッシュ・テーブルの衝突について説明するが、インデックスがハッシュ・テーブルを使用して実施される場合にだけ適用される。
【0108】
衝突は、2つのキー210、212が、同じ位置(スロット)216にハッシュ214した場合に、ハッシュ・テーブル内で起こる(図21)。この状況を解決する1つの方法は、第2のエントリを単に廃棄するという方法である。ある場合には、これは正しい選択である場合がある。しかし、ハッシュ・テーブルが損失を許容するものでない場合には、このオプションを使用することはできないので、この「オーバーフロー」状況を処理するために種々様々な技術のうちの1つを使用することができる。
【0109】
衝突を処理するために昔から使用されてきた1つの技術は、「オーバーフロー」領域220と呼ぶ別の記憶領域を有する方法である。各ハッシュ・テーブル・スロットは、オーバーフロー・フィールド222を含む。スロット内で衝突が起きた場合には、オーバーフロー・エントリ224は、オーバーフロー領域内に格納され、エントリへのポインタがスロット222内に置かれる(図22)。オーバーフロー領域によりエントリはまた相互にポイントすることができ226、各オーバーフロー・スロットは、エントリのリストをポイントすることができる(図22)。(ハッシュ・テーブルがメモリ内に位置していて、メモリ・ヒープの形をしている場合のように)別々のオーバーフロー領域を使用できる場合には、この技術はうまく動作する。しかし、ハッシュ・テーブルがディスク上に位置している場合には、オーバーフロー領域内にオーバーフロー・エントリを置くと、通常、非常に遅い少なくとも1回のランダム・アクセス・シークを行うステップが関連してくる。
【0110】
衝突へのもっとうまいアプローチは、衝突しているエントリを、ハッシュ・テーブル自身内に格納する方法である。昔からのアプローチの場合には、衝突が起こると、第2のハッシュ関数により第2の項目キーがハッシュされ、結果として得られたスロットがチェックされる。スロットが空である場合には、エントリをそこに格納することができる。もしスロットが空でない場合には、第3のハッシュ関数を呼び出すことができ、空のスロットが発見されるまでこの手順が反復して行われる。全テーブルが満杯である場合には、テーブルを分割してからでなければ、新しいエントリを追加することはできない。一般に、ハッシュ関数H(K,X)は、Kがハッシュするキーであり、Xが、衝突しているエントリに対するハッシュ・テーブル内の連続している候補の位置を発見するために増大することができる正の整数である場合に定義することができる。キーKを探索するために、キーを含むスロットを発見するまで、または(テーブル内のハッシュ・オーバーフロー・チェーンの終わりを示す)空のスロットに遭遇するまで、X=1,2,...に対してスロットH(K,X)がチェックされる。
【0111】
このアプローチの問題は、ハッシュ・テーブルが大きなもので、ディスク上に位置している場合には、衝突チェーンの後で、非常に時間がかかる一連のランダム・アクセス・シークをディスク上で行わなければならないことである。このことはH(K,X)=H(K,X−1)+1と定義することにより、すなわち、(テーブルの終わりのところを囲んでいる)次の隣接スロット230(図23)に溢れることにより避けることができる。この技術の場合には、アクセスは局部的なままである。アクセスした第1のスロットを読み出した場合には、次のSスロットも小さなSに対して読み出され、ディスク動作は、(例えば、12バイトの代わりに1Kを読み出すように)余分な時間はかからないし、オーバーフロー・スロットも提供する。新しいエントリが追加されると、複数のスロットを1つのグループとしてディスクに書戻すことができる。衝突チェーンがS個のスロットを超えて跨ることが希になるように(およびそれにより追加のディスク・アクセスが必要になるように)(おそらく動的に)値Sが調整される。
6.17 ハッシュ・テーブル・バケット
インデックスがディスク上に格納されている場合には、インデックスへのランダム・アクセス読出しおよび書込みは時間がかかるものになる場合がある。それ故、あるスロットから他のスロットに溢れるチャンスがある場合には、2つ以上のスロットを一度に読出しおよび書込みするのは理にかなっている。そうするための1つの方法は、テーブルをバケット240に分割し(図24)、エントリのかわりにバケットを読み出し、書き込む方法である。例えば、1024のスロットのテーブルを、それぞれが16のスロットを含む64のバケットのテーブルで置き換えることができる。エントリを探索するために、バケットを読み出して、バケット内で線形探索を行うことができ(またはバケット内のキーがソートされる場合、二分探索をおそらく行うことができる)。時々であるがバケットが満杯になっている場合がある。その場合には、オーバーフローは次のバケットに移動する。テーブルがあまり大きく成長できない限りは、オーバーフロー・チェーンはあまり長くすべきではない。
6.18 ハッシュ・テーブルの成長
ハッシュ・テーブルを使用した場合の1つの問題は、満杯になった場合、拡張するはっきりした方法がないことである。
【0112】
この問題に対する1つのアプローチは、テーブルがけっして満杯にならないようにすることである。このことは、最初に、特定の用途の場合にけっして満杯にならないほど大きなハッシュ・テーブルを生成することにより行うことができる。しかし、ある用途の場合には、予めハッシュ・テーブル上の負荷を予測することができない場合があり、そのため他の解決方法を発見しなければならない。
【0113】
1つのアプローチは、新しいもっと大きなハッシュ・テーブルを生成し、旧テーブル内のすべてのエントリを新テーブルに転送することによりハッシュ・テーブルを廃棄する方法である。転送中に両方のテーブルを保持するための十分なメモリが存在する限り、このアプローチは完全に実行可能な方法である。
【0114】
もう1つのアプローチは、満杯になったらいつでもハッシュ・テーブルのサイズを2倍にし、第1の(旧)250の半体内のエントリの(約)半体を、第2の(新)251の半体に転送する方法である。図25は、その方法を示す。最初のハッシュ・テーブルが2Kのエントリを有している場合には、全キーの下のKビットを、テーブルを索引するために使用することができる。テーブルが満杯になったら2倍に増大することができる。この新テーブルは、全キー254のK+1の最も低いビットをキーとして使用する。現在使用しているキーの余分なビット(ビットK)は、2倍にしたテーブルの旧テーブルおよび新テーブルの半体を区別する。全キーの左側の残りは未使用のままである。あとは、そのビットKが1である2倍にしたテーブルの旧半体内のエントリを新半体内の対応する位置に移動するだけでよい。実際には、オーバーフローがあるので、これより少し複雑になる。最初に、オーバーフローは、エントリがテーブルの旧半体内の「自然の」位置に位置していなくて、それ故、すべてのエントリを単に移動すると、ビットKセットがいくつかのエントリを正しくない位置に移動する。このことは、再ハッシュが必要なことを意味する。第二に、旧半体内のエントリを除去すると、いくつかのオーバーフロー・チェーンが切断する場合があり、いくつかのエントリにアクセスできなくなる恐れがある。それ故、エントリを移動した場合、そのエントリのオーバーフロー・チェーンをギャップを埋めるためにもとに戻してやらなければならない。
6.19 サブブロック・インデックス部分キーの格納
インデックスのサイズを小さくする1つの方法は、各インデックス・エントリ内にインデックスのキーのコピーを格納しない方法である。例えば、インデックス・キーが、(サブブロックの)128ビットのMD5ハッシュである場合には、インデックスのサイズを小さくする1つの方法は、インデックスのエントリ内のキーの一部だけを記録する方法である。
【0115】
例えば、インデックスがハッシュ・テーブル120として実施される場合には、各ハッシュ・テーブル・エントリ122は、通常、クラスタ番号124およびサブブロック・ハッシュ126のコピーを含む(図12)。これにより、インデックスのハッシュ・テーブル内の同じ位置に2つのサブブロックがハッシュされた場合には、2つのエントリを区別することができる。しかし、ハッシュが128ビット幅を有していて、各ハッシュの64ビットだけを格納する場合には、エントリは、依然として区別することができるが、スペースの半分を使用することになる。
【0116】
極端な場合、ハッシュ・テーブルは、任意のキーの任意の部分を含んでいない。代わりに、各サブブロック・ハッシュは、ハッシュ・テーブル内のある位置にハッシュし、その位置で発見したすべてのクラスタを探索しなければならない。これは、依然として記憶装置内のすべてのクラスタの線形探索より遥かに優れている。
【0117】
最善のアプローチは、ハッシュのある部分は格納するが、すべてのハッシュは格納しない方法である。このことは、希な場合ではあるが、ハッシュ・テーブル内に2つ以上の一致するエントリが存在する場合があり、一組の一致するエントリに参照したすべてのクラスタを探索しなければならないことを意味する。エントリ内のハッシュの一部だけを格納すれば、いくつかのクラスタをチェックしなくてもすみ、しかも依然として完全なハッシュよりかなり少ないスペースしか使用しない十分な違いを提供する。
6.20 BLOBの削除
ある用途の場合には、BLOBを削除し、またBLOBを格納しなければならない場合がある。BLOBの削除を行わなければならない場合がある。何故なら、BLOBのスパン内で参照したすべてのサブブロックを単に削除する(次に、BLOBのスパンおよびBLOBレコードを削除する)明らかなアプローチは、このような行為は、他の(削除していない)BLOBの一部でもあるサブブロックを削除する恐れがあるために失敗するからである。もっと高度なアプローチが望ましい。
【0118】
BLOBを削除するためのあるアプローチは、記憶装置内の各サブブロックに余分なメタデータを追加する方法である。基準カウント。サブブロックの基準カウントは、サブブロックを含む(BLOB内の)スパンの数を格納する。基準カウント・アプローチの場合には、サブブロックを含む新しいスパンが生成されると(すなわち、BLOB格納中に)サブブロックの基準カウントが増大し、このようなスパンが削除されると(すなわち、BLOB削除中に)この基準カウントが低減する。その基準カウントがゼロになった場合には、サブブロックを削除することができる。
【0119】
基準カウント・アプローチを使用すれば、記憶システムは、BLOBを削除することができる。しかし、ユーザはこの機能を必要としない。基準カウントの他の方法は、満了システムである。このシステムの場合、各BLOBおよび各サブブロックは満了日を有する。BLOBを格納した場合、ユーザは満了日を提供し、BLOBが追加され、スパンの新しいリストが生成される。追加プロセスの一部として、スパン・リストが参照したサブブロックは、その前の満了日の最大値に設定したその満了日を有し、それらを新しく参照しているBLOBの日付を有する。BLOBおよびサブブロックに満了日を表示すると、背景プロセスは、満了したBLOBおよびサブブロックを自由に削除することができる。
6.21 既存のファイル・システムを使用する実施形態
本発明の実施形態は、既存のファイル・システムの頂部上で実施することができる。図31は、その構成方法を示す。
【0120】
このような実施形態の場合、各クラスタは、1つのクラスタ・ファイル340内に格納することができる。クラスタに番号が付けられている場合には、各クラスタの名前は、クラスタ番号を含むことができる。クラスタ・ファイルは、1つのディレクトリ342またはディレクトリのツリー344内に格納することができる(図34)。クラスタはそのファイル上でランダム・アクセス読出しおよび書込みを行うことにより直接修正することもできるし、またはクラスタ・ファイルをメモリ内の完全な読み出し、それを修正し、およびシーケンシャルなIO動作を使用して、全ファイルをディスクに書き戻すことにより修正することができる。
【0121】
もう1つの実施形態は、既存のファイル・システムを使用することができるが、1つのファイルしか使用しない。クラスタは、メモリ内に保持しているクラスタインデックス332を使用することにより、隣接して位置する1つのファイル330内に格納することができる(図33)。
【0122】
固定長クラスタ・ディレクトリを使用する場合には、クラスタ・ディレクトリの一組全体を、ディレクトリを格納している1つのファイル内にアレイとして格納することができ、ファイルにランダム・アクセスを行って特定のディレクトリにランダム・アクセスすることができるようにする。
【0123】
各BLOBは、その名前がBLOBのハッシュの名前であるファイル内に格納することができる。BLOBファイルは、BLOBディレクトリ内、またはディレクトリ(おそらくBLOBハッシュの連続しているバイトにより構成されているデジタル探索ツリー)内に格納することができる。各BLOBファイルは、BLOBを表すスパンのリストを含むことができる。ファイル・システムのファイル毎のスペース・オーバーヘッドを避けるために、複数のBLOBを1つの「BLOB」ファイル内に格納することができる。
6.22 仮想ブロック装置を使用する実施形態
本発明の実施形態は、既存のオペレーティング・システム322が提供する仮想ブロック装置を使用して実施することができる(図32)。クラスタは、メモリ内に保持しているクラスタインデックスを使用することにより、隣接して位置する仮想ブロック装置内に格納することができる。
6.23 データを格納しない実施形態
すでに説明した実施形態のいずれかと同じではあるが、任意のBLOBデータを実際に格納しない実施形態を生成することができる(図35)。このような実施形態の場合には、すべての記憶構造およびメタデータを構成することができるが、BLOB/サブブロック・コンテンツは格納されない。この実施形態のような実施形態は、前に遭遇したBLOB1に関連してBLOB2を分析しなければならない用途の際に役に立つが、その場合、BLOBを実際には格納してはならない。
【0124】
例えば、セキュリティ環境においては、BLOBコンテンツ自身を格納しないで、前に遭遇したBLOBに関連してBLOBを分析するためにBLOBメタデータを使用する方が有利な場合がある。記憶構造および既存のBLOBを表すメタデータを使用することにより、記憶装置は、前に遭遇したBLOBにアクセスしなくても、前に遭遇したBLOBの本体に関連して文書を分析することができる。例えば、このことはセキュアなゲートウェイに適用することができる。
6.24 範囲に関する注
当業者であれば、本発明は、上記の特定の用途に限定されないことを理解することができるだろう。また、本発明は、本明細書に記載し図面に示した特定の要素および/または機能に関してその好ましい実施形態に限定されない。本発明の原理から逸脱することなしに、種々の修正を行うことができることを理解することができるだろう。それ故、本発明は、本発明の範囲内に入るすべてのこのような修正を含むものと解釈すべきである。
【図面の簡単な説明】
【0125】
【図1】BLOBのサブブロックへの分割である。
【図2】クラスタ内のBLOBのサブブロックの記憶装置である。
【図3】BLOBを、クラスタ内のサブブロックの一続きの部分を識別するスパンの順序付きリストとして表す方法である。
【図4】データの共通シーケンス(サブブロックA〜CおよびG〜J)を含む2つの異なるBLOBを、各反復サブブロックを2回以上格納しないですむ方法で表す方法である。
【図5】サブブロックを含むクラスタの数に各サブブロックのハッシュをマッピングするインデックスを示す。
【図6】BLOBを固定長サブブロックに分割する分割方法である。
【図7】クラスタの開始のところにサブブロック・ディレクトリを含むサブブロックのクラスタである。
【図8】クラスタのディレクトリをクラスタ自身とは別々に格納する方法である。
【図9】クラスタ・サブブロック・ディレクトリのエントリをクラスタ全体に分配する方法である。
【図10】(格納しているBLOBの)サブブロックAがクラスタ#1内にすでに存在することを発見した後で、BLOB内の以降のサブブロック(B、CおよびD)をそのクラスタ内でAの後のサブブロック(この場合は、B、CおよびD)と比較することができ、それによりサブブロック・インデックス内のB、CおよびDを参照しなくてもすむBLOBを格納する態様を示す。
【図11】それぞれが、BLOB内のサブブロックを識別するスパンの順序付きリストを含む(または参照する)BLOBレコードにBLOBハッシュをマッピングするBLOBテーブルである。
【図12】サブブロック・インデックス・ハッシュ・テーブルであり、テーブルのエントリである。
【図13】(従来技術)データの同じサブ・シーケンスの2つの例を含む2つのファイルである。さらに、ファイルAは、それ自身の中に同一のファイルを有する。
【図14】(従来技術)従来の記憶システムのその共通データを識別しようとしないファイルの格納方法である。
【図15】(従来技術)従来のデータ圧縮が各BLOBのサイズを小さくするが、BLOB間のデータの共通シーケンスを識別しないことを示す。
【図16】データの同じシーケンスを含む2つのBLOBの表示が、データのこれらのシーケンスを参照し、そのためシーケンスを1回格納するだけですむ方法である。
【図17】任意の部分一致があるか否かをチェックするために、一致する一続きの部分の各端部のところのサブブロックを直接比較する方法である。
【図18】一続きの部分の両端のところに部分サブブロックを含むサブブロックの一続きの部分を表すために(それぞれがバイト・カウントを保持する)2つの追加フィールド「開始スキップ」および「終了スキップ」で、スパン・レコードを増大する方法である。
【図19】BLOBを格納した場合に、孤立している一致サブブロック(C)がBLOBの表示で分割を行う方法である。
【図20】記憶装置で孤立サブブロック(C)を2回格納することを選択することにより分割を避ける方法である。
【図21】2つのキーが、テーブル内の同じ位置にハッシュするハッシュ・テーブル衝突を示す。
【図22】外部オーバーフロー・リストを含むハッシュ・テーブルである。
【図23】オーバーフロー・エントリが次の空のスロットに格納されるテーブル内オーバーフローである。
【図24】それぞれが一定数のエントリ・スロットを含むバケットのアレイとして構成されたハッシュ・テーブルである。
【図25】全キーの余分なビットを使用してハッシュ・テーブルのサイズを2倍にする方法である。
【図26】3つの分岐を含むスパンのツリーである。スパンをツリーに編成することにより、BLOB内のランダム・アクセスが高速になる。図面の番号は、各子ノードが表すブロックの長さである。
【図27】元のBLOB内で隣接しているサブブロックの一続きの部分を識別するためのクラスタ内のサブブロックの一連番号の意図的なスキップである。
【図28】2つのサブブロックAおよびBを直接比較しないで、これらのサブブロックAおよびBを比較する暗号ハッシュ関数Hの使用方法である。代わりに、そのハッシュH(A)およびH(B)が比較される。
【図29】サブブロックA、B、CおよびDを索引し、そのキーが、サブブロック自身ではなく、(ハッシュ関数Hを使用する)サブブロックのハッシュであるサブブロック・インデックスである。
【図30】サブブロックに分割され、低冗長記憶装置に格納されたにも関わらず、BLOBがその統合性を保持していることをチェックするための暗号ハッシュ関数Hの使用方法である。元のBLOBのハッシュは、格納しているBLOBと一緒に格納され、検索したBLOBのハッシュと比較される。
【図31】既存のファイル・システム(の頂部上)を使用して低冗長記憶システムが実施される実施形態である。
【図32】既存のオペレーティング・システムが提供する仮想ブロック装置(の頂部上)を使用して低冗長記憶システムを実施する実施形態である。
【図33】1つのブロック装置またはファイル・システム内の1つのファイル内に、長さが変化するクラスタを格納する方法である。クラスタ・インデックスは、その番号によりクラスタを迅速に発見するために使用することができる。
【図34】既存のファイル・システム内のファイルの対応する集合体内へのクラスタの集合体の格納方法である。この例の場合には、ディレクトリ・ツリーは、クラスタ番号上の小数デジタル探索ツリーを形成する。
【図35】BLOBを格納するために必要な構造およびメタデータを生成したが、データ自身を格納していない実施形態である。
【図36】元のスパン(サブブロックFGH)と同じデータを指しているが、記憶装置の異なる部分(この場合は、異なるクラスタ)内に位置する別のスパンにより増大したスパン(スパンのリスト内の2番目)である。
【図37】制約Fを使用するサブブロックへのブロックbの分割、およびハッシュ関数Hを使用するサブブロックのハッシュの計算を示す。
【図38】典型的なコンピュータ・ハードウェア上での低冗長記憶システムの配置方法である。すべてのデータ構造は、ディスク上に常駐している。また、インデックスも、いくつかのBLOBレコードおよびクラスタの作業コピーを格納しているいくつかのキャッシュと一緒にメモリ内に保持される。
【技術分野】
【0001】
本発明は、コンピュータ・システムにおいて記憶空間が少なくてすむ形式でデータを格納する方法および装置に関する。
【背景技術】
【0002】
従来のコンピュータ記憶システムは、通常、ファイル・システム内に名前付きファイルとしてバイトのシーケンスを格納している。多くのファイルは相互に非常に似ている場合があり、データの大部分130、132を共有している場合がある(図13)のに、これらのシステムはこの冗長性を除去することができない。それどころか、これらのシステムは、同じデータの多数のコピー130、132を保持しながら各ファイル140、142を別々に格納していることもある(図14)。
【0003】
従来のファイル・システムの中には、個々のファイルを圧縮するために、(GZipのような)従来の損失を起こさないテキスト圧縮アルゴリズムを組み込んでいるものがあるが、これは「鍵穴」冗長除去技術と見なすことができる。何故なら、この技術は、ファイル・システムを全体として分析するのではなく、ある時点で1つのファイルの冗長性を分析するからである。これらの従来のテキスト圧縮アルゴリズムは、ファイル・システムの異なる部分の2つの類似しているファイル130、132のような遠く離れているデータ150、152間の類似性を見つけることができない場合がある(図15)。
【発明の開示】
【発明が解決しようとする課題】
【0004】
そこで、データのその反復シーケンスのいくつかを識別し、格納しているこの反復データのコピーの数を低減することができる形式でデータを表示する方法および装置が求められている。
【課題を解決するための手段】
【0005】
データの反復シーケンスのコピーの数を低減するような方法で、いくつかの異なるバイナリ・ラージ・オブジェクト(BLOB)10、12を表示するために、2つ以上のBLOB表示により各反復シーケンスを参照することができる表示を使用することができる。図16は、このことを達成することができる1つの方法を示す。この実施形態の場合には、各BLOB160、162はサブブロックと呼ばれる部分A、B、C、D、E、F、Gに分割され、サブブロックの複製164、166は識別され、1回だけ格納される。このフレームワークにおいては、下記の問題が解決される。すなわち、BLOBをサブ分割する方法、結果として得られるサブブロックを格納する方法、およびサブブロックの複製を識別するための方法。
【0006】
本発明のある態様によれば、格納するデータの各BLOB10、12は、分割方法によりサブブロックA〜Jに分割される(図1)。種々の分割方法を使用することができるが、特に、データを固定長のサブブロック60〜65に分割する固定長分割方法を使用することもできるし(図6)、またはデータ自身により定めた位置で(図1)、データを可変長のサブブロックE、F、G、A、B、C、Dに分割する可変長分割方法を使用することもできる(図10)。本発明者と同じ発明者であるWilliamsの米国特許第5,990,810号に、この後者の方法の一例が開示されている。この米国特許は、参照により本明細書に組み込まれ、図37に示す。
【0007】
サブブロックは、冗長除去の単位になり、ある実施形態の場合には、システムは、せいぜい一度だけ一意の各サブブロックを格納する。他の実施形態の場合には、一意の各サブブロックのコピーの数は低減するが、2以上の場合がある。
【0008】
例示的実施形態の場合には、BLOBのサブブロックは、サブブロック・クラスタ20、22、24と呼ばれるグループ内に格納される(図2)。各BLOBは、それぞれが1つのクラスタ20、22、24内のサブブロックの隣接シーケンスを識別するレコード(「スパン・レコード」)30、31、32の順序付きリスト(またはツリー)により表示することができる(図3および図4)。BLOB10は、スパン30、31、32のリストにより識別されたシーケンスの連結として表示することができ(図3および図4)、各スパンが参照したサブブロック内のサブブロック・コンテンツを検索するスパンのBLOBのリストを順次チェックすることにより、記憶装置から検索することができる。
【0009】
例示的実施形態においては、クラスタ20、22、24は、2つ以上のBLOB XおよびYからのサブブロックを含むこともできるし(図4)、BLOBのサブブロックは、2つ以上のクラスタ内に常駐することもできる(図3)。例示的実施形態において、BLOBのサブブロックを1つまたは複数のクラスタ内に順次格納することができる(図2)。これによりBLOB検索の効率が改善される。何故なら、BLOB内のサブブロックの全シーケンスを、1回の順次読出動作でディスクから読み出すことができるからである。このことは、各サブブロックを探してランダム・アクセス・ディスク・シークを行うよりも遥かに効率的である。
【0010】
例示的実施形態においては、同じまたは異なるBLOB内の異なるスパンは、同じサブブロックを含む(図4)。これにより冗長性を低減することができる。何故なら、同じサブブロックを含むBLOBは、(クラスタ内の)同じサブブロックを指すスパンにより表示することができるからである。
【0011】
本発明のさらに他の態様によれば、各クラスタは、クラスタが使用するスペースの大きさを低減するためにデータ圧縮方法により圧縮される。これを行う最も簡単な方法は、全クラスタを圧縮することである。いくつかの実施形態(特に大きなクラスタを使用する実施形態の場合には)においては、全クラスタ(またはサブブロックを読み出す前のクラスタの少なくとも一部)を圧縮解除しなくても、クラスタ内のサブブロックにアクセスすることができるように、クラスタの各部分(例えば、個々のサブブロックまたはサブブロックの一続きの部分)を圧縮することが望ましい場合がある。
【0012】
本発明のさらに他の態様によれば、各クラスタ内のサブブロックのディレクトリ70が各クラスタに対して生成され、(通常は開始のところの)クラスタ内に格納されるか(図7)、または別々に80、82(図8)内に格納される。ディレクトリは、例えば、サブブロックの前に各サブブロックのメタデータを格納することにより、クラスタ全体に分配することもできる(図9)。ディレクトリは、そのハッシュ、長さ、サブブロック識別子、およびクラスタ内のその位置のような、各サブブロックに対する種々のメタデータを含むことができる。
【0013】
本発明のさらに他の態様によれば、2つ以上のBLOBが共有するサブブロックが識別される。例示的実施形態においては、サブブロックのコンテンツまたはサブブロック・ハッシュ(サブブロックのコンテンツのハッシュ)をクラスタ52、54、56にマッピングする(または関連付ける)サブブロック・インデックス50が維持される。格納動作中、格納される各サブブロックが、サブブロック・インデックス内で参照される。存在する場合には、サブブロックは再度格納されない。サブブロックが存在しない場合には、サブブロックはクラスタ内に格納され、それに対するエントリがサブブロック・インデックスに追加される。いずれの場合も、新しいサブブロックがスパン58により参照される。
【0014】
本発明のある態様によれば、特定のサブブロックが記憶装置内にすでに存在していることをインデックスが示す場合には、一致するサブブロックのクラスタがアクセスされ、クラスタ内の一致するサブブロックの後のサブブロックが、格納するBLOB内の一致するサブブロックの後のサブブロックと比較される(図10)。この比較はインデックスにアクセスしないで行うことができ、実際には、サブブロックを含んでいるクラスタが、サブブロック・ハッシュを含むサブブロック・ディレクトリを有している限り、実際のサブブロック・コンテンツ・データにアクセスしないで行うことができる。
用語
欠落サブブロック:記憶装置内に存在していないサブブロック
BLOB(バイナリ・ラージ・オブジェクト):データのゼロまたはそれ以上のバイト(またはビット)の有限シーケンス。その名前にも関わらず、BLOBは必ずしも大きくはない。BLOBは、数ビットまたはバイトのように小さいものであってもよいし、またはギガバイトのように大きいものであってもよい。
【0015】
BLOBレコード:特定のBLOBについての情報を記録している記憶装置内に維持されているレコード。また、BLOBレコードは、BLOBコンテンツを定義するスパンのリスト(またはツリー)を含むこともできるし、または参照することもできる。
【0016】
BLOBテーブル:BLOB識別子(例えば、制限なしに、BLOBハッシュ)をBLOBレコードに関連付けるデータ構造
クラスタ:「サブブロック・クラスタ」の短縮語。関連するサブブロックのグループ。クラスタは、クラスタ内のサブブロックについての情報を提供する関連サブブロック・ディレクトリを有することができる。
【0017】
クラスタ・サブブロック・ディレクトリ:クラスタ内のサブブロックについての情報を提供するメタデータの集合体。サブブロックのメタデータは、サブブロックの長さ、ハッシュ、識別子および基準カウントを含むことができる(しかし、含むことができるものはこれらに限定されない)。
【0018】
隣接する:物事の順序付きグループ内の2つの物事が隣り合っている場合には、隣接するという。Nの物事が正確にN−1の隣り合った1対の物事を含んでいる場合には(すなわち、Nの物事が1つの連続している一続きの部分として表される場合には)、物事の順序付きグループ内のNという物事は隣接している。
【0019】
隣接サブブロック:隣り合っている場合には、あるコンテキスト(例えば、BLOBまたはクラスタ)において、2つのサブブロックは隣接している。Nという物事が正確にN−1の隣り合った1対のサブブロックを含んでいる場合には(すなわち、サブブロックが1つの連続している一続きの部分となっている場合には)、あるコンテキストにおいてNのサブブロックは隣接している。
【0020】
ディレクトリ:クラスタ・サブブロック・ディレクトリ参照
ディスク:コンピュータが使用するランダム・アクセス記憶媒体。通常、ディスクという用語は、磁化したデータを保持している金属の回転円盤(ハードディスク)を意味する。本明細書においては、ディスクという用語は、メモリよりかなり遅いランダム・アクセス記憶媒体を意味するようにもっと広義に解釈することができる。
【0021】
固定長分割方法:データを固定長サブブロックに分割するデータを分割するための方法。例えば、固定長分割方法は、BLOBを512バイトのサブブロックに分割することができる。
【0022】
ハッシュ:ハッシュ・アルゴリズムが生成したバイト(またはビット)の固定長シーケンス。サブブロックのハッシュは、サブブロックを索引し、比較するためのサブブロックを表すものとして使用することができる。
【0023】
ハッシュ・アルゴリズム:バイト(またはビット)の有限シーケンスを受け入れ、入力シーケンスに高度に依存するバイト(またはビット)の有限シーケンスを生成するアルゴリズム。通常、ハッシュ・アルゴリズムは、特定の固定長の出力を生成する。ハッシュ・アルゴリズムは、シーケンスを直接比較しなくても、データの2つのシーケンスが同じであるか否かをチェックするための試験に使用することができる。実際に暗号化ハッシュを使用すれば、そのハッシュが同じである場合、2つのサブブロックが同じであると結論することができる。ハッシュ・アルゴリズムは、BLOB識別子を生成し、サブブロックを比較し、ハッシュ・テーブル・キーを生成するために、例示的実施形態において使用することができる。
【0024】
サブブロックのハッシュ:サブブロック・ハッシュ参照
インデックス:サブブロック・インデックス参照
インデックス・バケット:ハッシュ・テーブルを使用してサブブロック・インデックスを実施する実施形態の場合には、ハッシュ・テーブルを、それぞれが空であるかエントリを含み、それぞれが一定数のエントリ・スロットを含むバケットのアレイとして構成することができる。インデックス・バケットの1つの目的は、ハッシュ・テーブルを、ランダム・アクセス・ディスク動作の回数を低減するために、グループとしてディスクから読み出し、ディスクに書き込むことができる部分に構成することである。
インデックス・エントリ:サブブロック・インデックス内のレコード。ある実施形態の場合には、インデックス・レコードは、インデックス・キーおよびインデックス値を含む。ある実施形態の場合には、インデックス・レコードは、インデックス・キーの一部およびインデックス値を含む。ある実施形態の場合には、インデックス・レコードはインデックス値だけを含む。ある実施形態の場合には、インデックス・レコードは値を含まないで、キーの一部または全部を含む。
【0025】
インデックス・キー:サブブロックについての情報を検索するために、サブブロック・インデックスに提供されるサブブロックについての情報。ある実施形態の場合には、この情報はインデックス・エントリの位置を発見し、読み出すことにより検索される。
【0026】
インデックス値:サブブロック(またはその一例がそのハッシュであるサブブロックの派生物)をインデックスで参照した場合に、インデックスによりサブブロックについて生成された情報。ある実施形態の場合には、この値は、ディスク上のサブブロックの位置からなる。他の実施形態の場合には、インデックスの唯一の目的がキーの有無を記録することである場合には、値が存在しない場合がある。ある実施形態の場合には、この値は単にクラスタ数からなる。
【0027】
サブブロックの長さ:サブブロック・コンテンツ内のバイト(またはビット)数
線形探索:1つずつ集合体内のオブジェクトをチェックすることによる、およびチェックする次のオブジェクトの選択が前のチェックの結果により影響を受けない場合の、オブジェクトの集合体内の1つのオブジェクトに対する探索方法。
スパンのリスト:スパンの順序付きリスト。このようなリストは、BLOBのコンテンツを表示するために使用することができる。
【0028】
一致する一続きの部分:(例えば、格納しているBLOB内に存在してもよい)サブブロックの他のシーケンスと一致する(クラスタ内の)サブブロックのシーケンス。ある実施形態の場合には、サブブロックのシーケンスは隣接している。
【0029】
メモリ:通常、ランダム・アクセス・メモリ(RAM)を参照するコンピュータが使用するランダム・アクセス記憶媒体。本明細書においては、この用語は、「ディスク」よりかなり速いランダム・アクセス記憶媒体を意味するようにもっと広義に解釈することができる。
【0030】
分割方法:BLOB内の各バイト(またはビット)が、正確に1つのサブブロック内に入るように、BLOBを1つまたは複数のサブブロックに分割するための方法。
【0031】
存在サブブロック:記憶装置内に存在するサブブロック。
【0032】
低冗長:バイト(またはビット)の同一シーケンスのコピー数の任意のタイプのデータ表示での低減である。
【0033】
低冗長記憶装置:データのその表示の際に、自身が格納している一組のデータ内の複製データのいくつかを除去する記憶システム。
【0034】
サブブロックへの参照:サブブロックを識別する1つのデータ。例えば、制限なしで、参照は、コンテンツまたは格納位置によりサブブロックを識別することができる。
【0035】
基準計数:あるエンティティがもはや必要なくなった時を判定するための方法。この方法は、エンティティに対して存在する参照の数を記録するカウンタを維持するステップを含む。基準カウントがゼロになった場合には、エンティティを削除することができる。ある実施形態の場合には、BLOBおよび/またはサブブロックは基準カウントを有する。
【0036】
スパン:クラスタ内のサブブロックのシーケンス。ある実施形態の場合には、このシーケンスは隣接している。
【0037】
スパン・レコード:クラスタ内のスパンを識別するレコード。ある実施形態の場合には、スパン・レコードは、クラスタ番号フィールド、開始サブブロック識別子フィールド、および(サブブロックまたはバイトの)スパン長フィールドを含む。
【0038】
記憶装置:低冗長記憶装置参照。
【0039】
サブブロック:索引、比較および/または冗長除去のための単位として識別されたバイト(またはビット)のシーケンス。BLOBはサブブロックに分割することができる。
【0040】
サブブロック・クラスタ:一緒に格納している1つまたは複数のサブブロックのグループ。「クラスタ」とも呼ばれる。
【0041】
サブブロック・コンテンツ:サブブロックのメタデータとは異なるサブブロックの実際のデータ。
【0042】
サブブロック・ディレクトリ:クラスタ・サブブロック・ディレクトリ参照。
【0043】
サブブロック満了日:サブブロックをユーザが必要としないことを保証された場合に、最も初期の日付を定義するサブブロックと関連する1つのメタデータ。
【0044】
サブブロック・ハッシュ:サブブロックへのハッシュ・アルゴリズムの適用結果。サブブロックのハッシュは、例えば、サブブロックを索引および/または比較するために、サブブロックを表すものとして使用することができる。
【0045】
サブブロック識別子:サブブロックに関連する1つのメタデータ。識別子はクラスタ内のサブブロックに対して一意のものであり、それ故、そのクラスタ内のサブブロックを一義的に識別するために使用することができる。ある実施形態の場合には、異なるクラスタ内のサブブロックは、同じ識別子を有することができる。
【0046】
サブブロック・インデックス:サブブロックの位置(例えば、制限なしで、クラスタ番号(およびまた、おそらくサブブロック識別子))に、サブブロックのハッシュ(またはサブブロック自身)をマッピングする(または他の方法で関連付ける)データ構造。
【0047】
サブブロック・メタデータ:サブブロックについての情報。サブブロックのメタデータは、(制限なしに)サブブロックの長さ、サブブロックのハッシュ、サブブロックの識別子、サブブロックの満期日付、およびサブブロックの基準カウントを含むことができる。
【0048】
サブブロック・レコード:1つのサブブロックに対するメタデータを含むクラスタ・サブブロック・ディレクトリ内のレコード。
【0049】
サブブロック基準カウント:サブブロックに対する参照の現在数を記録する1つのサブブロック・メタデータ。ある実施形態の場合には、これはサブブロックを含むスパンを定義するスパン・レコードの数である。
【0050】
サブブロック一連番号:サブブロック識別子の形式。例えば、一連番号システムを使用するある実施形態の場合には、特定のクラスタに到着するサブブロックには、第1のサブブロックに対して1から始まり増大する一連番号が割り当てられる。ある実施形態の場合には、サブブロックを削除した場合には、一連番号は再使用されない。これらの実施形態の場合には、一連番号は、クラスタ内のサブブロックを一意に識別する方法を提供する。
【0051】
ユーザ:記憶装置内にBLOBを格納し、検索する1つのソフトウェア。
【0052】
可変長分割方法:BLOBを可変長サブブロックに分割する分割方法。好ましい実施形態の場合には、可変長分割方法は、データをデータのコンテンツが決定する境界のところで分割する。例えば、制限なしに、分割方法は、前のいくつかのバイトが、特定の所定の一定値にハッシュするBLOB内の各位置のところのサブブロック境界を定義することができる。
【0053】
仮想ブロック装置:オペレーティング・システムが提供する固定長記憶ブロックのアレイからなる装置。仮想装置は、物理デバイスに直接対応することができ、または(例えば、RAIDを使用して)1つまたは複数の物理デバイスから構成することができる。
【0054】
全キー:小さな派生キーの元として使用されるキー。データ構造が成長し、派生キーが必要になるので、全キーの増大する部分を、派生キーを形成するのに使用することができる。
【0055】
本明細書全体および添付の特許請求の範囲を通して、別段の指示がない限り、「備える」および「含む」という用語、および「備えている」および「含んでいる」という派生語は、「包含」および「除外しないこと」を意味する用語であると理解されたい。例えば、このような用語を記載の整数または整数のグループを参照するために使用した場合には、このような用語は、任意の他の整数または整数のグループの除外を意味しない。
【0056】
本明細書の添付の特許請求の範囲は、本明細書に記載する本発明の広義の記述であり、参照により本明細書に組み込まれる。
【0057】
本明細書での任意の従来技術への参照は、このような従来技術が共通の一般的知識の一部を形成しているという容認でもなければ、任意の形式の示唆でもないし、またそのように解釈すべきでもない。
【0058】
添付の図面を参照しながら、以下に本発明の特定の実施形態についてさらに詳細に説明する。これらの実施形態は、説明のためのものであって、本発明の範囲を制限するためのものではない。他の実施形態の示唆および記述を本発明の範囲内に含めることができるが、これらのものは添付の図面には示していないし、または別の方法で本発明の機能を図面には示してあるが本明細書には記述していない。
【発明を実施するための最良の形態】
【0059】
図5は、本発明の典型的な実施形態の要素の概観である。この実施形態は、BLOBレコード51、53と、スパン・リスト58と、クラスタ52、54、56と、サブブロック・インデックス50とを含む。図38は、典型的なコンピュータ・ハードウェア上でのこれらの要素の配置を示す。すべてのデータ構造はディスク380上に常駐している。インデックス381も、いくつかのBLOBレコード382およびクラスタ383のいくつかの作業コピーを格納しているいくつかのキャッシュと一緒にメモリ内に保持されている。
6.1 ハッシュ関数の概観
すべての実施形態においてはハッシュ関数を使用していないが、ハッシュ関数は、多くの実施形態でいくつかの利点を提供する。下記の説明は、本発明の種々の実施形態に関連して使用することができる例示としてのハッシュ関数の概観である。
【0060】
ハッシュ関数は、ビットの可変長入力ブロックを受け入れ、入力ブロックをベースとするビットの出力ブロックを生成する。大部分のハッシュ関数は、出力ブロックが特定の長さ(例えば、16ビット)になることを保証し、入力ブロックの無限集合と出力ブロックの有限集合との間でランダムではあるが、決定論的マッピングを提供するようにする。ランダムさの特性により、「ハッシュ」と呼ばれるこれらの出力を、入力ブロックの容易に操作した表示として動作させることができる。
【0061】
ハッシュ関数は少なくとも4つのクラスの強度を有する。
【0062】
狭いハッシュ関数:狭いハッシュ関数は、最も弱いクラスのハッシュ関数であり、出力値の全スペースを妥当な時間内に探索することができるような、非常に狭い(例えば、16ビット)出力値を生成する。例えば、8ビットのハッシュ関数は、任意のデータ・ブロックを0〜255の範囲内のハッシュにマッピングする。16ビットのハッシュ関数は、0〜65535の範囲内のハッシュにマッピングする。特定のハッシュ値の場合には、単に探索する値が表れるまで、ランダム・ブロックを生成し、これらのブロックを狭いハッシュ関数に提供することにより、対応するブロックを発見することができる。狭いハッシュ関数は、一組のデータ値を少数のグループに任意に(しかし決定論的に)分類するために、通常、使用される。それ故、狭いハッシュ関数は、ハッシュ・テーブル・データ構造を構成し、ノイズの多い通信チャネルを通して送信したデータのエラーを検出するのに役に立つ。このクラスの例としては、CRC−16、CRC−32、フレッチャ・チェックサム、IPチェックサム等がある。
【0063】
広いハッシュ関数:広いハッシュ関数は、その出力値がかなり広いということを除けば、狭いハッシュ関数に類似している。ある点においては、この定量的違いは、定性的違いを意味する。広いハッシュ関数の場合には、出力値が非常に広い(例えば、128ビット)ので、同じハッシュ値を有する任意の2つのランダムに選択したブロックの確率は無視することができる(例えば、1038のうちの約1)。この特性により、これらの広いハッシュを、これらが計算されたデータのブロックの「ID(identity)」として使用することができる。例えば、エンティティE1がデータのブロックを有し、エンティティE2にブロックの広いハッシュを送った場合で、エンティティE2が同じハッシュを有するブロックを有している場合には、ブロックが実際に異なる先験的確率は無視することができる。唯一の問題は、広いハッシュ関数が非反転できるように設計されていないことである。それ故、(例えば)2128値のスペースは、狭いハッシュ関数のところで説明した方法で探索するにはあまりに広すぎるが、ハッシュ関数を分析し、特定のハッシュに対応するブロックを計算するのは容易である。それ故、E1が本当に異なるブロックである場合には、E1は、E2がE1が1つのブロックを有すると思い込ませることができる。このクラスの例としては、任意の128ビットのCRCアルゴリズムがある。
【0064】
弱一方向ハッシュ関数:弱一方向ハッシュ関数は、「ID」を提供するのに十分広いばかりでなく、特定のハッシュ値が与えられた場合、そのハッシュ値に対応するブロックを発見するのが極度に難しい暗号保証を提供する。このクラスの例としては、64ビットDESハッシュがある。
【0065】
強一方向ハッシュ関数:強一方向ハッシュ関数は、同じハッシュ値を有する任意の2つの異なるブロックを発見するのが難しい暗号保証を提供する追加特性を有することを除けば、弱一方向ハッシュ関数と同じものである。この場合、ハッシュ値は指定されない。このクラスの例としては、MD5およびSHA−1がある。
【0066】
これら4つのクラスのハッシュは、選択が行われるある範囲のハッシュ強度を提供する。予想されるように、ハッシュ関数の速度は、強度が増大するにつれて低減し、トレードオフを提供し、異なる用途の場合には異なる強度が適切な強度になる。しかし、違いは非常に小さいので、最もタイムクリティカルな用途以外では、強一方向ハッシュ関数を使用することができる。
【0067】
暗号ハッシュという用語は、多くの場合、弱一方向ハッシュ関数のクラスおよび強一方向ハッシュ関数のクラス両方を含む暗号強度を提供するハッシュを指すために使用される。
【0068】
本発明の例示的実施形態は、少なくとも2つの役割でハッシュ関数を使用することができる。
【0069】
1.サブブロック境界を決定するために。
【0070】
2.サブブロックIDを生成するために。
【0071】
用途に従って、上記4つのクラスのうちの任意のクラスからのハッシュ関数をいずれかの役割で使用することができる。しかし、サブブロック境界の決定にはIDおよび暗号強度が必要ないので、最も弱いクラス以外からのクラスからのハッシュ関数を使用するのは非効率である。同様に、IDの必要性、絶えず存在する破壊行為の脅威、および強一方向ハッシュ関数(弱一方向ハッシュ関数と比較した場合)に対する低性能というペナルティは、強一方向ハッシュ関数より弱いいかなるものもサブブロックIDの計算に使用すべきではないことを示唆している。
【0072】
IDを生成するために強一方向ハッシュ関数以下の何かを使用する際につきもののセキュリティの危険は、任意のこのような弱ハッシュ関数を使用する本発明を組み込む記憶システムを考慮することにより説明することができる。このようなシステムにおいては、侵入者は、修正したサブブロックが、ターゲット・システム内にすでに存在することを侵入者が知っている他のサブブロックと同じハッシュを有するように、(ターゲット・システムにより操作される)サブブロックを修正することができる。そうすると、ターゲット・システムがそれを新しいものと置き換えないで、既存のサブブロックを保持する結果になる恐れがある。(例えば)ターゲット・システムがネットワーク上で検索したセキュリティ・パッチを正しく適用するのを防止するために、このような弱点を使用することができる。
【0073】
それ故、敵意を持つ人間に曝されないシステムでサブブロックを計算するのに、広いハッシュ関数を安全に使用することができるが、弱一方向ハッシュ関数が、これらのシステムでは非セキュアとなる恐れがある。
【0074】
ここで、ブロックまたはサブブロックのハッシュを実際に使用することができる方法について説明する。
6.2 暗号ハッシュの使用
暗号ハッシュ(およびここでは強一方向ハッシュ関数)の理論特性は、特に興味のある実際の特性を生成する。このようなハッシュはかなり広いので、2つのランダムに選択したサブブロックが、同じハッシュを有する確率は事実上ゼロであり(128ビット・ハッシュの場合には、1038のうちの約1であり)、同じハッシュを有する2つのサブブロックを発見するのは計算上不可能であるので、スパイがそのようなことを行うことができないことを事実上保証している。これらの特性の密接な関係は、実際の見地から見ると、特定の暗号ハッシュ・アルゴリズムに対するハッシュ値の有限集合は、有限の可変長サブブロックの無限集合に対して1対1の関係になる。これは、同じ値にハッシュする2つのサブブロックを発見するのは実際上不可能であるので、実際には、理論上不可能な特性であることは明らかである。
【0075】
この特性は、(同一であることのために)比較の目的で、計算されたサブブロックの代わりに、暗号ハッシュを安全に使用することができることを意味する。大部分の暗号ハッシュは約128ビットの長さしかないので、ハッシュは、サブブロック自身のコンテンツを直接比較しなくても、サブブロックを比較するための非常に効率的な方法を提供する。
【0076】
本発明の例示的実施形態で暗号ハッシュが使用されるいくつかの方法は下記の通りである。
【0077】
サブブロックの比較:暗号ハッシュHは、2つのサブブロックA、Bのコンテンツを比較しなくても、またはアクセスしなくても、2つのサブブロックA、Bを比較280するために使用することができる(図28)。
【0078】
サブブロックのインデックス:サブブロックA、B、C、Dの集合体を索引するために、そのキーがサブブロック292、294、296、298のハッシュであるインデックス290を構成することができる(図29)。
BLOBチェック:BLOB300のサブブロック302への分割、および再構成したBLOB304へのサブブロックの以降の再組立を確実にエラーのないものにするために、暗号ハッシュを使用することができる。このことは、元のBLOBのハッシュ306を再構成したBLOBのハッシュ308と比較309することにより行うことができる(図30)。
6.3 安全ネットとしてのハッシュの使用
本発明の実施形態は、これらの実施形態を組み込む記憶システムをさらに複雑にする場合がある。このように複雑になると、潜在的にエラーが検出されない機会が多くなる。
【0079】
複雑さの主な機構は、BLOBのサブブロックへの分割であり、このようなサブブロックの以降の再組立である。BLOBをサブブロックに分割することにより、記憶システムが、サブブロックを間違って追加したり、削除したり、再配置したり、置換したり、複製したり、または何らかの他の方法で偶然のエラーのより大きなリスクに曝されたりする恐れがでてくる。
【0080】
このリスクは、サブブロックに分割される前にBLOBのハッシュ(好適には暗号ハッシュであることが好ましい)を計算し、このハッシュを全体としてBLOBに関連するエンティティと一緒に格納し、次に、格納しているハッシュを、再構成したブロックの計算したハッシュと比較することにより、低減または除去することができる。このようなチェックは、本発明を使用することによるエラーが検出されないリスクを事実上取り除く非常に強力な安全ネットを提供する(図30)。
【0081】
BLOBをチェックするもう1つの方法は、そのサブブロックのハッシュの連結をハッシュし、記憶装置からBLOBを検索した場合の値をチェックする方法である。この方法は、全体的に見てハッシュしなければならないデータが少なくてすみ、このような実施形態をより効率的にすることができるという利点を有する。
6.4 クラスタ内へのサブブロックの格納
クラスタ内にサブブロックを格納することができる方法は多数ある。「サブブロックのコンテンツ」という用語は、実際のサブブロックを形成するバイトのシーケンスを意味する。例示的実施形態においては、クラスタ74内のサブブロック72は、メタデータの介入なしで背中合わせに格納される(図7)。クラスタがそれ自身のディレクトリを持たない実施形態の場合には、背中合わせのサブブロック・コンテンツは、クラスタが含んでいなければならないすべてのものであってもよい。
【0082】
背中合わせにサブブロックを格納する利点は、サブブロックの隣接する一続きの部分を1つのシーケンシャルな動作としてクラスタから読み出すことができることであり、次に、最初に、メタデータを除去しなくても、メモリ内に保持し、1つのシーケンシャルな動作として書き出すことができることである。
【0083】
サブブロックをクラスタに分割する方法を決定するために多数の方法を使用することができる。1つの方法は、少なくともS個のサブブロックを有するまでクラスタにサブブロックを書き込む方法である。ここで、Sは所定の定数である。もう1つの方法は、少なくともMメガバイトを含むまで、クラスタにサブブロックを書き込む方法である。ここで、Mは所定の定数である。
6.5 クラスタ・サブブロック・ディレクトリ
クラスタは、クラスタ内のサブブロックについての情報を提供し、クラスタ内のサブブロックの位置を迅速に発見することができるサブブロック・ディレクトリを有することができる。
【0084】
クラスタは、ディレクトリ70を有している場合には、ディレクトリをクラスタの始めの部分(図7)またはクラスタの終わりの部分に置くことができる。もう1つの例は、サブブロック・コンテンツ92とディレクトリ90エントリをインタリーブする例である(図9)。最後に、ディレクトリ80、82は別々に格納することができる(図8)。
【0085】
1つの簡単なオプションは、クラスタ内のサブブロック数上に上部限界Lを置き、クラスタ内のサブブロック数が何であれ、カウントにLディレクトリ・エントリのアレイを加えたものとしてディレクトリを表す方法である。これにより固定長ディレクトリ80、82が出来上がり、クラスタのディレクトリを、残りのクラスタのコンテンツ84、86(すなわち、サブブロックのコンテンツ)とは別々に1つのアレイを格納することができる(図8)。
6.6 クラスタ・サブブロック・ディレクトリ内のサブブロック・メタデータ
クラスタのサブブロック・ディレクトリは、各サブブロックの長さを格納することができる。通常、各サブブロックの長さの単位はバイトである。サブブロックの長さを格納した場合には、クラスタのサブブロックのコンテンツを、境界がサブブロック間にあることを決定するために、分割方法を呼び出さなくても、サブブロックに分割することができる。
【0086】
クラスタのディレクトリは、各サブブロックのハッシュを格納することができる。例えば、ディレクトリは、クラスタ内の各サブブロックの128ビットのMD5または160ビットのSHA−1を格納することができる。各サブブロックのハッシュを格納することは役に立つ。何故なら、格納中、システムが、サブブロックXのコンテンツをサブブロックYのコンテンツと比較しなくても、新しく到着したサブブロックYがクラスタ内で発見されたことを確認することができるからである。代わりに、システムは、サブブロックYのハッシュを計算し、それを(そのクラスタのディレクトリ内で発見することができる)サブブロックXのハッシュと比較する。それ故、格納しているBLOB内のサブブロックを、記憶装置内のサブブロックのコンテンツを読み出さなくても、インデックスおよびクラスタ・ディレクトリだけを使用して、記憶装置内に存在しているか否かを試験することができる。
【0087】
また、クラスタのディレクトリは、各サブブロックに対するサブブロック識別子を格納することもできる。サブブロックの識別子は、クラスタ内の一組のサブブロック内で一意のものである。サブブロック識別子を実施する1つの簡単な方法は、固定幅(例えば、16ビット)を選択し、各クラスタ内の一連番号カウンタを割り当て、ゼロから開始し、次の整数を各サブブロックにその一連番号識別子として割り当てる方法である。カウンタが最大値に達した場合には、クラスタを新データに対して単に閉鎖することができる。別の方法としては、サブブロックをクラスタから削除した場合には、未使用の識別子を再度割り当てることができる。これはサブブロック識別子を実施する多くの方法のうちの1つの方法である。
【0088】
一連番号をサブブロック識別子として使用した場合には、その連続性をBLOB内のサブブロックの1つの一続きの部分から格納したクラスタ内のサブブロック276〜278の一続きの部分の始まりおよび終わりを示すために使用することができる。ある実施形態の場合には、このことは各格納している一続きの部分272、274の終わりのところの一連番号をスキップ(廃棄)することにより行うことができる(図27)。一連番号を使用しない場合には、クラスタ内のサブブロックの一続きの部分の(元のBLOB内のサブブロックの一続きの部分に対する)終わりを示すために、各サブブロックのメタデータに、ブール値を追加することができる。
6.7 クラスタの圧縮
システム内に圧縮(例えば、制限なしに、GZiP)を組み込むことができる方法は多数ある。1つの簡単な方法は、ディスクに書き込む前に、各クラスタに対して1つのシーケンシャルな動作として圧縮を行う方法である。もう1つの方法は、各サブブロックを個々に圧縮する方法である。もう1つの方法は、隣接する一連番号と一緒にサブブロックの各一続きの部分を圧縮する方法である。
【0089】
クラスタは、圧縮した形式でディスク上に格納することができる。また、これらのクラスタは、圧縮した形式でメモリに格納することもできる。
6.8 スパン・サブブロック−一続きの部分の識別
各スパンは、特定のクラスタ内のサブブロックの一続きの部分を識別する。例示的実施形態の場合には、スパンは、サブブロックの一続きの部分を含むクラスタを識別する情報を含む。サブブロックの一続きの部分を識別するための広い範囲の可能性がある。そのため、一続きの部分内の最初および最後のサブブロックを識別することができ、または最初(または最後)のサブブロックを識別することができ、長さを提供することができる。長さはバイト単位またはサブブロック単位で測定することができる。
【0090】
例示的実施形態のサブブロックを識別するために、スパンは、サブブロックのハッシュ(この場合、クラスタは(サブブロックのディレクトリを使用して(1つ有している場合))サブブロックを探索しなければならないが)、クラスタ(例えば、「第3のサブブロック」)内のサブブロックの位置、またはサブブロック識別子を使用することができる。
【0091】
ハッシュの幅は比較的広い。クラスタ内に(例えば)1000のサブブロックが存在する場合には、サブブロック識別子は、約10ビットの幅を有していればよいのだが、典型的なハッシュは128ビットの幅を有する。そのクラスタ内の(サブブロック単位で測定した)位置を使用すると、スペースをもっと効率的に使用することができるが、(サブブロックを含んでいるBLOBを記憶装置から削除した場合に起こるかもしれないように)サブブロックをクラスタから削除した場合、故障が起こる。これを避けるために、例示的実施形態の場合には、(クラスタ内で一意の)クラスタ内の各サブブロックに一意の識別子を割り当てることができる。この識別子は、クラスタのディレクトリ内に各サブブロックのメタデータと一緒に格納することができる。このような識別子は、(ビット単位で)十分狭いものであってもよいが、サブブロックがクラスタ内でシフトしても、サブブロックをはっきりと識別する。
【0092】
もう1つのアプローチは、そのハッシュでサブブロックを参照する方法であるが、同じクラスタ内で他のすべてのサブブロックからそのサブブロックを区別するために必要なものである。スパン・レコード内の短い固定長フィールドは、記録するハッシュのバイト数を記録するために使用することができる。この方法を使用すれば、サブブロック識別子を使用する必要がなくなるし、スパン・レコードに長いハッシュによる負担がかからなくなる。この方法を使用すれば、スパン・レコードは可変長を有することができる。この方法の1つの潜在的な問題は、クラスタに追加されるサブブロックが、既存の参照を曖昧にする恐れがあることである。この問題は、このような曖昧な参照がいつでも曖昧な参照を満たす第1のサブブロックを参照するように注意することにより解決することができる。
【0093】
もう1つの方法は、サブブロックの一連番号を使用するが、これらの一連番号をスパンにより直接参照されるサブブロックだけに割り当てる方法である。実際には、スパンの第1のサブブロックは非常に少ないので、遥かに少ない数の一連番号を格納するだけですむ。
6.9 部分サブブロックの一致
BLOB170の格納中、1つまたは複数の一致するサブブロックB、Cの一続きの部分をクラスタ174内で発見した場合には、一致しているサブブロックの一続きの部分のどちらかの側面上の一致していないサブブロックのある部分が、格納しているBLOB内の対応するサブブロックの対応部分と一致する可能性がある。図17は、格納中のBLOB170および比較しているクラスタ174を示す。インデックスを使用して、サブブロックBCの一致する一続きの部分を発見した。各側面上のサブブロックは一致しない。AはEと一致しないし、DはFと一致しない。それ故、一致する一続きの部分はちょうど2つのサブブロックの長さである。しかし、BCの一致を発見した場合、周囲のサブブロックをもっと精密なレベルで比較することができる。
【0094】
サブブロックAの終わりとサブブロックEの終わりと比較すれば、これらのサブブロックが、同じ(例えば)123バイトの接尾部を共有していることが分かる。同様に、サブブロックDの始まりをサブブロックFの始まりと比較すると、これらのサブブロックが、同じ(例えば)1045バイトの接頭部を共有していることが分かる。これらを部分サブブロックの一致と呼ぶ。
【0095】
部分サブブロックの一致を発見した場合には、多数の方法を使用することができる。図18は、スパン内の最初のサブブロックの始まりのところ、およびスパン内の最後のサブブロックの終わりのところで無視すべきバイト数を記録する余分なフィールド「開始スキップ」180および「終了スキップ」182を含むように、スパン・レコード構造を増大することができる方法を示す。もう1つの方法は、サブブロックのどちらかの終わりを延長するために、バイト数を記録する2つのフィールド「開始エクステンド」および「終了エクステンド」を使用する方法である。ある実施形態は、上記各フィールドの一方または両方の使用を選択することができる。
【0096】
サブブロックの一続きの部分内のバイトのある範囲を参照するもう1つの方法は、「終了スキップ」フィールドを、スパン内のバイトの全数である長さで置換する方法である。
6.10 フラグメンテーションの低減
格納しているBLOBがすでに格納済みの多くのサブブロックを含んでいるが、多くの異なるクラスタ全体に散乱している場合には、BLOBは、ディスク全体を指すスパンのリストの表示で終わる。要するに多数に分割される。
【0097】
一致しないサブブロックの長い一続きの部分内の1つのサブブロックが一致する場合には、ある特に不都合な形のフラグメンテーションが起こる。図19は、BLOB1 190が記憶装置内にすでに格納されていて、BLOB2 192を格納中であり、1つの一致するサブブロックCが、BLOB2内のサブブロックF〜Mの他の方法で一致しない一続きの部分内に位置するこの一例を示す。結果としては、一致するサブブロックに対する1つのスパン・レコード194がスパン・リスト196内に生成される。このタイプのフラグメンテーションは、BLOB2の検索時間を長くする傾向がある。何故なら、ランダム・ディスク・アクセスを、第1のクラスタ198および第2のクラスタ199に対して行わなければならないからである。
【0098】
ある種の実施形態は、孤立している一致サブブロックを一致していないとして処理し、これらのサブブロックを次に格納することにより、このタイプの1つの一致サブブロック・フラグメンテーションを避けることができる。図20は、余分のスペースを使用するが、BLOB2 202のフラグメンテーションを低減することにより、サブブロックCの孤立している一致を格納させるのを無視する方法を示す。この方法は、一致するサブブロックの予め定義したしきい値Tより短いすべての一致する一続きの部分を無視することにより一般化することができる。ある実施形態の場合には、1より大きいTの任意の値はフラグメンテーションを低減する傾向がある。値2も役に立つ。
6.11 BLOBテーブル
BLOBを格納する記憶システムは、そのユーザがBLOBを検索することができるように、BLOBを参照することができるようにするある方法を提供するものでなければならない。
【0099】
1つの方法は、BLOBのハッシュ110を識別子として使用する方法である(図11)。それ故、ユーザは、BLOBを記憶システムに提出し、BLOBのハッシュ(例えば、MD5ハッシュ)を書き留める。BLOBを検索するために、ハッシュを記憶システムに提出し、システムはBLOBを返送する。
【0100】
もう1つの方法は、任意の名前を各BLOBに割り当てる方法である。従来のファイル・システムはこの方法を使用する。
【0101】
どんなネーミング・スキームを採用しようとも実施しなければならない。このような実行は、本質的には、BLOB112名前空間から(スパンのリスト116を含む(または参照する)BLOBレコード114自身へのマッピングからなる(図11)。このマッピングは、デジタル探索ツリー、Bツリーおよびハッシュ・テーブルのようなすべてのタイプの従来のデータ構造を使用して行うことができる。
6.12 スパンのリストおよびツリー
BLOBテーブル112が参照する各BLOBレコード114は、BLOBの任意のメタデータを含み、スパン・レコード116の順序付きシーケンスを含んでいるかまたはポイントする(図11)。各スパン・レコードは、クラスタ内のサブブロックの(隣接する)一続きの部分を識別する。
【0102】
スパンの順序付きリスト内にスパンを維持すると、全BLOBをシーケンシャルに効率的に検索することができるが、格納しているBLOB上でランダム・アクセス読出しを行うために線形探索(またはスパン・レコードをランダムにアクセスできる場合には、二分探索)を必要とする。ランダム・アクセス読出しをスピードアップするために、BLOBのスパンをツリー構造に編成することができる。図26は、3つの分岐を含むツリーの一例である(が、任意の分岐を使用することができる)。各非葉ノードは、その子ノードが表すブロックの連結であるバイトの有限個のブロックを表す。各ノードは、その子ノードが表すブロックの長さである3つの長さを含む。各葉ノードは、クラスタ内の1つまたは複数のサブブロックのシーケンスを識別するスパン260からなる。このようなツリーが表す格納しているBLOBのバイトJ〜Kのランダム・アクセス読出しは、バイトJ〜Kを含むスパンを発見するためにツリーを下方に移動し、次にクラスタからサブブロック・コンテンツ・バイトを検索することにより行うことができる。
6.13 サブブロック・インデックス
サブブロック・インデックス(図5)を使用すれば、記憶装置内のすべてのクラスタの線形探索を行わなくても、記憶装置内に特定のサブブロックがすでに存在するか否かを判定することができる。また、インデックスは、一致するサブブロックの位置を発見する際に役に立つ情報を提供することができる。
【0103】
インデックス50は、それぞれがインデックス・キーをインデックス値に結合しているエントリの組織した集合体として表示することができる。エントリは、エントリ・レコード(それぞれがキー・フィールドおよび値フィールドからなる)として、インデックス内に明示的に、または(例えば、インデックスが、キー上に葉ノード内に値を含むバイナリ・デジタル探索ツリーとして組織されている場合には)暗黙的に格納することができる。
【0104】
インデックス・キーは、サブブロックのコンテンツであっても、サブブロックのコンテンツのハッシュであっても、またはサブブロックのコンテンツのハッシュの単なる一部であってもよい。サブブロックのコンテンツのハッシュの一部(例えば、全16バイトではなく、MD5ハッシュの最初の8バイト)だけを格納すると、時に起こる衝突を犠牲にして、インデックスのサイズを小さくすることができる。2つ以上のサブブロックが同じ部分ハッシュを有している場合には、インデックスは、両方のエントリを格納し、検索することができるものでなければならない。
【0105】
インデックス値は、記憶装置内のサブブロックの位置を発見する際に役に立つ情報でなければならない。ある極端な実施形態の場合には、この値は、クラスタ番号およびクラスタ内の特定のサブブロック(例えば、識別子、サブブロック一連番号またはサブブロック・ハッシュ)を識別する情報からなる正確な参照を提供することができる。極端な他の実施形態の場合には、インデックス値をクラスタ番号だけから構成することができる。サブブロックのクラスタ番号が分かると、存在する場合には、クラスタ内のサブブロックを発見するためにクラスタ・ディレクトリを探索することができる。インデックス内のスペースをさらに制約するために、インデックス値を、探索するのに2つ以上のクラスタを必要とするクラスタ番号の一部(例えば、クラスタ番号の最後の2つのビット)だけで構成することができる。
【0106】
選択の優れた組合わせは、インデックス・キーをサブブロック・ハッシュの頂部の8バイトとし、インデックス値をサブブロックを含むクラスタの数とする方法である。各クラスタに対するディレクトリが存在する限り、これらの選択は、インデックスのサイズを小さいままに維持し、依然として記憶装置の任意のサブブロックに高速でアクセスすることができる。
【0107】
インデックスは、デジタル探索ツリー、バイナリ・ツリー、およびハッシュ・テーブルを含む種々のデータ構造により行うことができる。
6.14 インデックスの格納
インデックスは、メモリ内またはディスク上に格納することができる。インデックスのサイズの低減は、インデックスがメモリ内に保持されている場合には重要な問題である。実験の結果、ある実施形態の場合には、インデックスがメモリ内に保持されている場合には、システムの動作が遥かに速くなることが分かっている。クラスタ内の目標のサブブロックの位置を識別する情報を格納しなくてすむならば、インデックスのサイズをかなり低減することができる。それ故、典型的な実施形態の場合には、インデックス内にクラスタ番号だけを格納する。
6.15 サブブロック・インデックスのためのハッシュ・テーブルの使用
サブブロック・インデックスは、低冗長記憶システムの速度を判定する際に非常に重要なものであるので、このデータ構造を最高速でアクセスできるように設計するのは重要なことである。ハッシュ・テーブルは、0(1)時間内にアクセスを提供するので、ハッシュ・テーブルは、サブブロック・インデックスに対して非常に優れたデータ構造を提供する。しかし、このハッシュ速度アクセスは、かなり高いものにつく。以下のいくつかの節は、サブブロック・インデックスが提起する課題について説明する。
6.16 ハッシュ・テーブルの衝突
この節においては、ハッシュ・テーブルの衝突について説明するが、インデックスがハッシュ・テーブルを使用して実施される場合にだけ適用される。
【0108】
衝突は、2つのキー210、212が、同じ位置(スロット)216にハッシュ214した場合に、ハッシュ・テーブル内で起こる(図21)。この状況を解決する1つの方法は、第2のエントリを単に廃棄するという方法である。ある場合には、これは正しい選択である場合がある。しかし、ハッシュ・テーブルが損失を許容するものでない場合には、このオプションを使用することはできないので、この「オーバーフロー」状況を処理するために種々様々な技術のうちの1つを使用することができる。
【0109】
衝突を処理するために昔から使用されてきた1つの技術は、「オーバーフロー」領域220と呼ぶ別の記憶領域を有する方法である。各ハッシュ・テーブル・スロットは、オーバーフロー・フィールド222を含む。スロット内で衝突が起きた場合には、オーバーフロー・エントリ224は、オーバーフロー領域内に格納され、エントリへのポインタがスロット222内に置かれる(図22)。オーバーフロー領域によりエントリはまた相互にポイントすることができ226、各オーバーフロー・スロットは、エントリのリストをポイントすることができる(図22)。(ハッシュ・テーブルがメモリ内に位置していて、メモリ・ヒープの形をしている場合のように)別々のオーバーフロー領域を使用できる場合には、この技術はうまく動作する。しかし、ハッシュ・テーブルがディスク上に位置している場合には、オーバーフロー領域内にオーバーフロー・エントリを置くと、通常、非常に遅い少なくとも1回のランダム・アクセス・シークを行うステップが関連してくる。
【0110】
衝突へのもっとうまいアプローチは、衝突しているエントリを、ハッシュ・テーブル自身内に格納する方法である。昔からのアプローチの場合には、衝突が起こると、第2のハッシュ関数により第2の項目キーがハッシュされ、結果として得られたスロットがチェックされる。スロットが空である場合には、エントリをそこに格納することができる。もしスロットが空でない場合には、第3のハッシュ関数を呼び出すことができ、空のスロットが発見されるまでこの手順が反復して行われる。全テーブルが満杯である場合には、テーブルを分割してからでなければ、新しいエントリを追加することはできない。一般に、ハッシュ関数H(K,X)は、Kがハッシュするキーであり、Xが、衝突しているエントリに対するハッシュ・テーブル内の連続している候補の位置を発見するために増大することができる正の整数である場合に定義することができる。キーKを探索するために、キーを含むスロットを発見するまで、または(テーブル内のハッシュ・オーバーフロー・チェーンの終わりを示す)空のスロットに遭遇するまで、X=1,2,...に対してスロットH(K,X)がチェックされる。
【0111】
このアプローチの問題は、ハッシュ・テーブルが大きなもので、ディスク上に位置している場合には、衝突チェーンの後で、非常に時間がかかる一連のランダム・アクセス・シークをディスク上で行わなければならないことである。このことはH(K,X)=H(K,X−1)+1と定義することにより、すなわち、(テーブルの終わりのところを囲んでいる)次の隣接スロット230(図23)に溢れることにより避けることができる。この技術の場合には、アクセスは局部的なままである。アクセスした第1のスロットを読み出した場合には、次のSスロットも小さなSに対して読み出され、ディスク動作は、(例えば、12バイトの代わりに1Kを読み出すように)余分な時間はかからないし、オーバーフロー・スロットも提供する。新しいエントリが追加されると、複数のスロットを1つのグループとしてディスクに書戻すことができる。衝突チェーンがS個のスロットを超えて跨ることが希になるように(およびそれにより追加のディスク・アクセスが必要になるように)(おそらく動的に)値Sが調整される。
6.17 ハッシュ・テーブル・バケット
インデックスがディスク上に格納されている場合には、インデックスへのランダム・アクセス読出しおよび書込みは時間がかかるものになる場合がある。それ故、あるスロットから他のスロットに溢れるチャンスがある場合には、2つ以上のスロットを一度に読出しおよび書込みするのは理にかなっている。そうするための1つの方法は、テーブルをバケット240に分割し(図24)、エントリのかわりにバケットを読み出し、書き込む方法である。例えば、1024のスロットのテーブルを、それぞれが16のスロットを含む64のバケットのテーブルで置き換えることができる。エントリを探索するために、バケットを読み出して、バケット内で線形探索を行うことができ(またはバケット内のキーがソートされる場合、二分探索をおそらく行うことができる)。時々であるがバケットが満杯になっている場合がある。その場合には、オーバーフローは次のバケットに移動する。テーブルがあまり大きく成長できない限りは、オーバーフロー・チェーンはあまり長くすべきではない。
6.18 ハッシュ・テーブルの成長
ハッシュ・テーブルを使用した場合の1つの問題は、満杯になった場合、拡張するはっきりした方法がないことである。
【0112】
この問題に対する1つのアプローチは、テーブルがけっして満杯にならないようにすることである。このことは、最初に、特定の用途の場合にけっして満杯にならないほど大きなハッシュ・テーブルを生成することにより行うことができる。しかし、ある用途の場合には、予めハッシュ・テーブル上の負荷を予測することができない場合があり、そのため他の解決方法を発見しなければならない。
【0113】
1つのアプローチは、新しいもっと大きなハッシュ・テーブルを生成し、旧テーブル内のすべてのエントリを新テーブルに転送することによりハッシュ・テーブルを廃棄する方法である。転送中に両方のテーブルを保持するための十分なメモリが存在する限り、このアプローチは完全に実行可能な方法である。
【0114】
もう1つのアプローチは、満杯になったらいつでもハッシュ・テーブルのサイズを2倍にし、第1の(旧)250の半体内のエントリの(約)半体を、第2の(新)251の半体に転送する方法である。図25は、その方法を示す。最初のハッシュ・テーブルが2Kのエントリを有している場合には、全キーの下のKビットを、テーブルを索引するために使用することができる。テーブルが満杯になったら2倍に増大することができる。この新テーブルは、全キー254のK+1の最も低いビットをキーとして使用する。現在使用しているキーの余分なビット(ビットK)は、2倍にしたテーブルの旧テーブルおよび新テーブルの半体を区別する。全キーの左側の残りは未使用のままである。あとは、そのビットKが1である2倍にしたテーブルの旧半体内のエントリを新半体内の対応する位置に移動するだけでよい。実際には、オーバーフローがあるので、これより少し複雑になる。最初に、オーバーフローは、エントリがテーブルの旧半体内の「自然の」位置に位置していなくて、それ故、すべてのエントリを単に移動すると、ビットKセットがいくつかのエントリを正しくない位置に移動する。このことは、再ハッシュが必要なことを意味する。第二に、旧半体内のエントリを除去すると、いくつかのオーバーフロー・チェーンが切断する場合があり、いくつかのエントリにアクセスできなくなる恐れがある。それ故、エントリを移動した場合、そのエントリのオーバーフロー・チェーンをギャップを埋めるためにもとに戻してやらなければならない。
6.19 サブブロック・インデックス部分キーの格納
インデックスのサイズを小さくする1つの方法は、各インデックス・エントリ内にインデックスのキーのコピーを格納しない方法である。例えば、インデックス・キーが、(サブブロックの)128ビットのMD5ハッシュである場合には、インデックスのサイズを小さくする1つの方法は、インデックスのエントリ内のキーの一部だけを記録する方法である。
【0115】
例えば、インデックスがハッシュ・テーブル120として実施される場合には、各ハッシュ・テーブル・エントリ122は、通常、クラスタ番号124およびサブブロック・ハッシュ126のコピーを含む(図12)。これにより、インデックスのハッシュ・テーブル内の同じ位置に2つのサブブロックがハッシュされた場合には、2つのエントリを区別することができる。しかし、ハッシュが128ビット幅を有していて、各ハッシュの64ビットだけを格納する場合には、エントリは、依然として区別することができるが、スペースの半分を使用することになる。
【0116】
極端な場合、ハッシュ・テーブルは、任意のキーの任意の部分を含んでいない。代わりに、各サブブロック・ハッシュは、ハッシュ・テーブル内のある位置にハッシュし、その位置で発見したすべてのクラスタを探索しなければならない。これは、依然として記憶装置内のすべてのクラスタの線形探索より遥かに優れている。
【0117】
最善のアプローチは、ハッシュのある部分は格納するが、すべてのハッシュは格納しない方法である。このことは、希な場合ではあるが、ハッシュ・テーブル内に2つ以上の一致するエントリが存在する場合があり、一組の一致するエントリに参照したすべてのクラスタを探索しなければならないことを意味する。エントリ内のハッシュの一部だけを格納すれば、いくつかのクラスタをチェックしなくてもすみ、しかも依然として完全なハッシュよりかなり少ないスペースしか使用しない十分な違いを提供する。
6.20 BLOBの削除
ある用途の場合には、BLOBを削除し、またBLOBを格納しなければならない場合がある。BLOBの削除を行わなければならない場合がある。何故なら、BLOBのスパン内で参照したすべてのサブブロックを単に削除する(次に、BLOBのスパンおよびBLOBレコードを削除する)明らかなアプローチは、このような行為は、他の(削除していない)BLOBの一部でもあるサブブロックを削除する恐れがあるために失敗するからである。もっと高度なアプローチが望ましい。
【0118】
BLOBを削除するためのあるアプローチは、記憶装置内の各サブブロックに余分なメタデータを追加する方法である。基準カウント。サブブロックの基準カウントは、サブブロックを含む(BLOB内の)スパンの数を格納する。基準カウント・アプローチの場合には、サブブロックを含む新しいスパンが生成されると(すなわち、BLOB格納中に)サブブロックの基準カウントが増大し、このようなスパンが削除されると(すなわち、BLOB削除中に)この基準カウントが低減する。その基準カウントがゼロになった場合には、サブブロックを削除することができる。
【0119】
基準カウント・アプローチを使用すれば、記憶システムは、BLOBを削除することができる。しかし、ユーザはこの機能を必要としない。基準カウントの他の方法は、満了システムである。このシステムの場合、各BLOBおよび各サブブロックは満了日を有する。BLOBを格納した場合、ユーザは満了日を提供し、BLOBが追加され、スパンの新しいリストが生成される。追加プロセスの一部として、スパン・リストが参照したサブブロックは、その前の満了日の最大値に設定したその満了日を有し、それらを新しく参照しているBLOBの日付を有する。BLOBおよびサブブロックに満了日を表示すると、背景プロセスは、満了したBLOBおよびサブブロックを自由に削除することができる。
6.21 既存のファイル・システムを使用する実施形態
本発明の実施形態は、既存のファイル・システムの頂部上で実施することができる。図31は、その構成方法を示す。
【0120】
このような実施形態の場合、各クラスタは、1つのクラスタ・ファイル340内に格納することができる。クラスタに番号が付けられている場合には、各クラスタの名前は、クラスタ番号を含むことができる。クラスタ・ファイルは、1つのディレクトリ342またはディレクトリのツリー344内に格納することができる(図34)。クラスタはそのファイル上でランダム・アクセス読出しおよび書込みを行うことにより直接修正することもできるし、またはクラスタ・ファイルをメモリ内の完全な読み出し、それを修正し、およびシーケンシャルなIO動作を使用して、全ファイルをディスクに書き戻すことにより修正することができる。
【0121】
もう1つの実施形態は、既存のファイル・システムを使用することができるが、1つのファイルしか使用しない。クラスタは、メモリ内に保持しているクラスタインデックス332を使用することにより、隣接して位置する1つのファイル330内に格納することができる(図33)。
【0122】
固定長クラスタ・ディレクトリを使用する場合には、クラスタ・ディレクトリの一組全体を、ディレクトリを格納している1つのファイル内にアレイとして格納することができ、ファイルにランダム・アクセスを行って特定のディレクトリにランダム・アクセスすることができるようにする。
【0123】
各BLOBは、その名前がBLOBのハッシュの名前であるファイル内に格納することができる。BLOBファイルは、BLOBディレクトリ内、またはディレクトリ(おそらくBLOBハッシュの連続しているバイトにより構成されているデジタル探索ツリー)内に格納することができる。各BLOBファイルは、BLOBを表すスパンのリストを含むことができる。ファイル・システムのファイル毎のスペース・オーバーヘッドを避けるために、複数のBLOBを1つの「BLOB」ファイル内に格納することができる。
6.22 仮想ブロック装置を使用する実施形態
本発明の実施形態は、既存のオペレーティング・システム322が提供する仮想ブロック装置を使用して実施することができる(図32)。クラスタは、メモリ内に保持しているクラスタインデックスを使用することにより、隣接して位置する仮想ブロック装置内に格納することができる。
6.23 データを格納しない実施形態
すでに説明した実施形態のいずれかと同じではあるが、任意のBLOBデータを実際に格納しない実施形態を生成することができる(図35)。このような実施形態の場合には、すべての記憶構造およびメタデータを構成することができるが、BLOB/サブブロック・コンテンツは格納されない。この実施形態のような実施形態は、前に遭遇したBLOB1に関連してBLOB2を分析しなければならない用途の際に役に立つが、その場合、BLOBを実際には格納してはならない。
【0124】
例えば、セキュリティ環境においては、BLOBコンテンツ自身を格納しないで、前に遭遇したBLOBに関連してBLOBを分析するためにBLOBメタデータを使用する方が有利な場合がある。記憶構造および既存のBLOBを表すメタデータを使用することにより、記憶装置は、前に遭遇したBLOBにアクセスしなくても、前に遭遇したBLOBの本体に関連して文書を分析することができる。例えば、このことはセキュアなゲートウェイに適用することができる。
6.24 範囲に関する注
当業者であれば、本発明は、上記の特定の用途に限定されないことを理解することができるだろう。また、本発明は、本明細書に記載し図面に示した特定の要素および/または機能に関してその好ましい実施形態に限定されない。本発明の原理から逸脱することなしに、種々の修正を行うことができることを理解することができるだろう。それ故、本発明は、本発明の範囲内に入るすべてのこのような修正を含むものと解釈すべきである。
【図面の簡単な説明】
【0125】
【図1】BLOBのサブブロックへの分割である。
【図2】クラスタ内のBLOBのサブブロックの記憶装置である。
【図3】BLOBを、クラスタ内のサブブロックの一続きの部分を識別するスパンの順序付きリストとして表す方法である。
【図4】データの共通シーケンス(サブブロックA〜CおよびG〜J)を含む2つの異なるBLOBを、各反復サブブロックを2回以上格納しないですむ方法で表す方法である。
【図5】サブブロックを含むクラスタの数に各サブブロックのハッシュをマッピングするインデックスを示す。
【図6】BLOBを固定長サブブロックに分割する分割方法である。
【図7】クラスタの開始のところにサブブロック・ディレクトリを含むサブブロックのクラスタである。
【図8】クラスタのディレクトリをクラスタ自身とは別々に格納する方法である。
【図9】クラスタ・サブブロック・ディレクトリのエントリをクラスタ全体に分配する方法である。
【図10】(格納しているBLOBの)サブブロックAがクラスタ#1内にすでに存在することを発見した後で、BLOB内の以降のサブブロック(B、CおよびD)をそのクラスタ内でAの後のサブブロック(この場合は、B、CおよびD)と比較することができ、それによりサブブロック・インデックス内のB、CおよびDを参照しなくてもすむBLOBを格納する態様を示す。
【図11】それぞれが、BLOB内のサブブロックを識別するスパンの順序付きリストを含む(または参照する)BLOBレコードにBLOBハッシュをマッピングするBLOBテーブルである。
【図12】サブブロック・インデックス・ハッシュ・テーブルであり、テーブルのエントリである。
【図13】(従来技術)データの同じサブ・シーケンスの2つの例を含む2つのファイルである。さらに、ファイルAは、それ自身の中に同一のファイルを有する。
【図14】(従来技術)従来の記憶システムのその共通データを識別しようとしないファイルの格納方法である。
【図15】(従来技術)従来のデータ圧縮が各BLOBのサイズを小さくするが、BLOB間のデータの共通シーケンスを識別しないことを示す。
【図16】データの同じシーケンスを含む2つのBLOBの表示が、データのこれらのシーケンスを参照し、そのためシーケンスを1回格納するだけですむ方法である。
【図17】任意の部分一致があるか否かをチェックするために、一致する一続きの部分の各端部のところのサブブロックを直接比較する方法である。
【図18】一続きの部分の両端のところに部分サブブロックを含むサブブロックの一続きの部分を表すために(それぞれがバイト・カウントを保持する)2つの追加フィールド「開始スキップ」および「終了スキップ」で、スパン・レコードを増大する方法である。
【図19】BLOBを格納した場合に、孤立している一致サブブロック(C)がBLOBの表示で分割を行う方法である。
【図20】記憶装置で孤立サブブロック(C)を2回格納することを選択することにより分割を避ける方法である。
【図21】2つのキーが、テーブル内の同じ位置にハッシュするハッシュ・テーブル衝突を示す。
【図22】外部オーバーフロー・リストを含むハッシュ・テーブルである。
【図23】オーバーフロー・エントリが次の空のスロットに格納されるテーブル内オーバーフローである。
【図24】それぞれが一定数のエントリ・スロットを含むバケットのアレイとして構成されたハッシュ・テーブルである。
【図25】全キーの余分なビットを使用してハッシュ・テーブルのサイズを2倍にする方法である。
【図26】3つの分岐を含むスパンのツリーである。スパンをツリーに編成することにより、BLOB内のランダム・アクセスが高速になる。図面の番号は、各子ノードが表すブロックの長さである。
【図27】元のBLOB内で隣接しているサブブロックの一続きの部分を識別するためのクラスタ内のサブブロックの一連番号の意図的なスキップである。
【図28】2つのサブブロックAおよびBを直接比較しないで、これらのサブブロックAおよびBを比較する暗号ハッシュ関数Hの使用方法である。代わりに、そのハッシュH(A)およびH(B)が比較される。
【図29】サブブロックA、B、CおよびDを索引し、そのキーが、サブブロック自身ではなく、(ハッシュ関数Hを使用する)サブブロックのハッシュであるサブブロック・インデックスである。
【図30】サブブロックに分割され、低冗長記憶装置に格納されたにも関わらず、BLOBがその統合性を保持していることをチェックするための暗号ハッシュ関数Hの使用方法である。元のBLOBのハッシュは、格納しているBLOBと一緒に格納され、検索したBLOBのハッシュと比較される。
【図31】既存のファイル・システム(の頂部上)を使用して低冗長記憶システムが実施される実施形態である。
【図32】既存のオペレーティング・システムが提供する仮想ブロック装置(の頂部上)を使用して低冗長記憶システムを実施する実施形態である。
【図33】1つのブロック装置またはファイル・システム内の1つのファイル内に、長さが変化するクラスタを格納する方法である。クラスタ・インデックスは、その番号によりクラスタを迅速に発見するために使用することができる。
【図34】既存のファイル・システム内のファイルの対応する集合体内へのクラスタの集合体の格納方法である。この例の場合には、ディレクトリ・ツリーは、クラスタ番号上の小数デジタル探索ツリーを形成する。
【図35】BLOBを格納するために必要な構造およびメタデータを生成したが、データ自身を格納していない実施形態である。
【図36】元のスパン(サブブロックFGH)と同じデータを指しているが、記憶装置の異なる部分(この場合は、異なるクラスタ)内に位置する別のスパンにより増大したスパン(スパンのリスト内の2番目)である。
【図37】制約Fを使用するサブブロックへのブロックbの分割、およびハッシュ関数Hを使用するサブブロックのハッシュの計算を示す。
【図38】典型的なコンピュータ・ハードウェア上での低冗長記憶システムの配置方法である。すべてのデータ構造は、ディスク上に常駐している。また、インデックスも、いくつかのBLOBレコードおよびクラスタの作業コピーを格納しているいくつかのキャッシュと一緒にメモリ内に保持される。
【特許請求の範囲】
【請求項1】
BLOBを複数のサブブロックに分割するステップと、
前記サブブロックを複数のクラスタ内に格納するステップと、
前記BLOBの表示を複数のスパンとして生成するステップであって、各スパンがクラスタ内のサブブロックのシーケンスを識別し、少なくとも1つのサブブロックが2つ以上のスパンにより参照されるステップとを含むBLOBを格納する方法。
【請求項2】
各スパンが、クラスタ内の1つまたは複数の隣接サブブロックのシーケンスを識別する、請求項1に記載の方法。
【請求項3】
前記複数のスパンが順序付きリストである、請求項1に記載の方法。
【請求項4】
前記複数のスパンがスパンのツリーである、請求項1に記載の方法。
【請求項5】
2つ以上のサブブロックが、介入メタデータを使用しないでクラスタ内にバイトの隣接シーケンスとして格納される、請求項1に記載の方法。
【請求項6】
前記サブブロックが、いくつかのサブブロック・メタデータとインタリーブしている、請求項1に記載の方法。
【請求項7】
各スパンが、クラスタ識別子、クラスタ・アドレス、サブブロック識別子、クラスタ内のサブブロック位置、長さのうちの少なくとも1つを使用して、クラスタ内の隣接サブブロックのシーケンスを識別する、請求項1に記載の方法。
【請求項8】
前記長さがサブブロック数である、請求項7に記載の方法。
【請求項9】
前記長さがバイト数である、請求項7に記載の方法。
【請求項10】
上部境界が、各クラスタ内のサブブロック数上に置かれる、請求項1に記載の方法。
【請求項11】
上部境界が、各クラスタ内のバイト数上に置かれる、請求項1に記載の方法。
【請求項12】
前記データが、前記一組のデータbをb内の少なくとも1つの位置k|k+1のところで複数のサブブロックに分割することにより分割され、b[k−A+1...k+B]が所定の制約を満たし、AおよびBが自然数である、請求項1に記載の方法。
【請求項13】
前記データを格納する前記データ構造が生成されるが、前記データ自身は格納されない、請求項1に記載の方法。
【請求項14】
データを複数のサブブロックに分割するステップと、
前記サブブロックを複数のクラスタに格納するステップと、
前記一組のデータの表示を複数のスパンとして生成するステップであって、各スパンがクラスタ内のサブブロックのシーケンスを識別し、少なくとも1つのサブブロックが2つ以上のスパンにより参照されるステップとを含む一組のデータを格納する方法。
【請求項15】
前記データがデータ・ファイルである、請求項14に記載の方法。
【請求項16】
スパンのグループにより参照された前記サブブロックから前記一組のデータを再構成するステップをさらに含む、請求項14に記載の方法。
【請求項17】
前記データが、前記一組のデータbをb内の少なくとも1つの位置k|k+1のところで複数のサブブロックに分割することにより分割され、b[k−A+1...k+B]が、所定の制約を満たし、AおよびBが自然数である、請求項14に記載の方法。
【請求項18】
各クラスタが、サブブロックのディレクトリを有し、前記ディレクトリが、各サブブロックの長さ、各サブブロックのハッシュ、前記クラスタ内の各サブブロックの位置、各サブブロックに対する識別子のうちの少なくとも1つを含む、請求項1に記載の方法。
【請求項19】
前記クラスタ・ディレクトリが、前記クラスタ内に格納される、請求項18に記載の方法。
【請求項20】
前記クラスタ・ディレクトリが、前記クラスタとは別々に格納される、請求項18に記載の方法。
【請求項21】
前記クラスタ・ディレクトリが、前記クラスタが含むサブブロック数が何であれ固定長である、請求項18に記載の方法。
【請求項22】
前記クラスタ・ディレクトリが固定長であり、クラスタ・ディレクトリの固定長アレイ内に前記クラスタとは別々に格納される、請求項18に記載の方法。
【請求項23】
前記クラスタが、前記クラスタ内のサブブロックの隣接する一続きの部分間の境界を記録する、請求項18に記載の方法。
【請求項24】
クラスタ内のサブブロック間の境界が、順序付き識別子を使用することにより、および境界のところでサブブロックに隣接していない識別子を割り当てることにより識別される、請求項18に記載の方法。
【請求項25】
圧縮アルゴリズムを使用して少なくとも1つのクラスタを圧縮するステップをさらに含む、請求項1に記載の方法。
【請求項26】
圧縮アルゴリズムを使用して少なくとも1つのサブブロックを圧縮するステップをさらに含む、請求項1に記載の方法。
【請求項27】
少なくとも2つの隣接サブブロックが、圧縮アルゴリズムを使用することにより圧縮される、請求項1に記載の方法。
【請求項28】
少なくとも1つのサブブロックを前記サブブロックを含む前記クラスタにマッピングするインデックスを維持するステップをさらに含む、請求項1に記載の方法。
【請求項29】
少なくとも1つのサブブロックのハッシュを、前記サブブロックを含む前記クラスタにマッピングするインデックスを維持するステップをさらに含む、請求項1に記載の方法。
【請求項30】
前記インデックスが、前記サブブロックを含む前記クラスタ内の各サブブロックの位置を含む、請求項28または29に記載の方法。
【請求項31】
前記インデックスが、そのキーがサブブロック・ハッシュであるデジタル探索ツリーとして実施される、請求項28または29に記載の方法。
【請求項32】
前記インデックスが、Bツリーとして実施される、請求項28に記載の方法。
【請求項33】
各BLOB内の各T番目のサブブロックだけが索引され、Tが所定の正の整数である、請求項28に記載の方法。
【請求項34】
各BLOB内の各T番目のサブブロックだけが索引され、Tが所定の正の整数である、請求項29に記載の方法。
【請求項35】
前記インデックスが、1つまたは複数のハッシュ・テーブルとして実施される、請求項28に記載の方法。
【請求項36】
サブブロックに対するハッシュ・テーブル・エントリが、前記サブブロックの前記ハッシュの全部または一部を含む、請求項35に記載の方法。
【請求項37】
前記ハッシュ・テーブルがバケットを含む、請求項35に記載の方法。
【請求項38】
各スパンが、前記クラスタ内の1つまたは複数のバイトの有限シーケンスを参照する、請求項1に記載の方法。
【請求項39】
各スパンが、xバイトだけ低減する前記スパンの範囲を示す少なくとも1つのスキップ値xを含む、請求項1に記載の方法。
【請求項40】
各スパンが、xバイトだけ増大する前記スパンの範囲を示す少なくとも1つの拡張値xを含む、請求項1に記載の方法。
【請求項41】
クラスタにサブブロックを追加する前に、前記インデックスをチェックすることによりサブブロックの複製をチェックするステップを含む、請求項28に記載の方法。
【請求項42】
格納するサブブロックのハッシュを、クラスタ内の前記サブブロックのうちの少なくとも1つの前記ハッシュと比較することにより、サブブロックの複製をチェックするステップであって、インデックスが格納するサブブロックを示すステップを含む、請求項29に記載の方法。
【請求項43】
スパンが、前記サブブロックの前記ハッシュの一部または全部を使用してサブブロックを識別する、請求項1に記載の方法。
【請求項44】
Tの現在のサブブロック以下の少なくとも1つの隣接する一続きの部分が、サブブロックの記憶装置内で複製され、Tがサブブロックの所定のしきい値である、請求項1に記載の方法。
【請求項45】
Tが2である、請求項44に記載の方法。
【請求項46】
1つまたは複数のサブブロックの少なくとも1つの隣接する一続きの部分が、サブブロックの前記記憶装置内で複製される、請求項1に記載の方法。
【請求項47】
少なくとも1つのスパンXが、スパンXにより参照されたデータのコピーを参照する別のスパンにより増大する、請求項1に記載の方法。
【請求項48】
前記インデックスをクラスタ内のサブブロックXの位置の発見に使用した場合に、格納中の前記サブブロックによりサブブロックの最も長い一致する一続きの部分を発見するために、前記クラスタがサブブロックXから順方向に探索される、請求項28に記載の方法。
【請求項49】
前記インデックスをクラスタ内のサブブロックXの位置の発見に使用した場合に、格納中の前記サブブロックによりサブブロックの最も長い一致する一続きの部分を発見するために、前記クラスタがサブブロックXから順方向に探索される、請求項29に記載の方法。
【請求項50】
BLOBを2つ以上のサブブロックに分割するためのデータ処理手段と、
1つまたは複数のクラスタ内に前記サブブロックを格納するためのデータ記憶手段と、
前記BLOBをスパンの順序付きリストまたはスパンのツリーとして表示するための手段とを備え、
各スパンがクラスタ内の1つまたは複数の隣接サブブロックのシーケンスを識別し、少なくとも1つのサブブロックが、2つ以上のスパンにより参照されるデータのBLOBを格納するデータ処理装置。
【請求項51】
前記処理手段が、各サブブロックを前記サブブロックを含む前記クラスタにマッピングするインデックスを維持する、請求項43に記載のデータ処理装置。
【請求項52】
前記処理手段が、クラスタにサブブロックを追加する前に、前記インデックスをチェックすることによりサブブロックの複製をチェックする、請求項44に記載のデータ処理装置。
【請求項53】
データのBLOBを格納するためのプログラマブル・デバイスを指示するために使用することができる、コンピュータ・プログラムを表すデータで符号化したコンピュータ可読メモリであって、
前記BLOBを2つ以上のサブブロックに分割するために、前記コンピュータ可読メモリを動作するための処理手段と、
1つまたは複数のクラスタ内に前記サブブロックを格納するために、前記コンピュータ可読メモリにより使用することができるデータ記憶手段と、
前記BLOBをスパンの順序付きリストまたはスパンのツリーとして表示するための手段とを備え、各スパンが、クラスタ内の1つまたは複数の隣接サブブロックのシーケンスを識別し、少なくとも1つのサブブロックが、2つ以上のスパンにより参照されるコンピュータ可読メモリ。
【請求項54】
前記処理手段が、各サブブロックを前記サブブロックを含む前記クラスタにマッピングするインデックスを維持する、請求項53に記載のコンピュータ可読メモリ。
【請求項55】
前記処理手段が、クラスタにサブブロックを追加する前に、前記インデックスをチェックすることによりサブブロックの複製をチェックする、請求項54に記載のコンピュータ可読メモリ。
【請求項56】
プログラマブル・デバイスに、
前記BLOBを複数のサブブロックに分割する第1の機能と、
前記サブブロックを複数のクラスタに格納する第2の機能と、
前記BLOBを関連するスパンのグループとして表示する第3の機能と
を実行させるために、データのBLOBを格納するためのコンピュータ・プログラム・コード手段を備えるコンピュータ・プログラム要素であって、
各スパンが、クラスタ内の1つまたは複数の隣接サブブロックのシーケンスを識別し、少なくとも1つのサブブロックが、2つ以上のスパンにより参照されるコンピュータ・プログラム要素。
【請求項57】
第4の機能が、各サブブロックを前記サブブロックを含む前記クラスタにマッピングするインデックスを維持する、請求項56に記載のコンピュータ・プログラム要素。
【請求項58】
第5の機能が、クラスタにサブブロックを追加する前に、前記インデックスをチェックすることによりサブブロックの複製をチェックする、請求項57に記載のコンピュータ・プログラム要素。
【請求項1】
BLOBを複数のサブブロックに分割するステップと、
前記サブブロックを複数のクラスタ内に格納するステップと、
前記BLOBの表示を複数のスパンとして生成するステップであって、各スパンがクラスタ内のサブブロックのシーケンスを識別し、少なくとも1つのサブブロックが2つ以上のスパンにより参照されるステップとを含むBLOBを格納する方法。
【請求項2】
各スパンが、クラスタ内の1つまたは複数の隣接サブブロックのシーケンスを識別する、請求項1に記載の方法。
【請求項3】
前記複数のスパンが順序付きリストである、請求項1に記載の方法。
【請求項4】
前記複数のスパンがスパンのツリーである、請求項1に記載の方法。
【請求項5】
2つ以上のサブブロックが、介入メタデータを使用しないでクラスタ内にバイトの隣接シーケンスとして格納される、請求項1に記載の方法。
【請求項6】
前記サブブロックが、いくつかのサブブロック・メタデータとインタリーブしている、請求項1に記載の方法。
【請求項7】
各スパンが、クラスタ識別子、クラスタ・アドレス、サブブロック識別子、クラスタ内のサブブロック位置、長さのうちの少なくとも1つを使用して、クラスタ内の隣接サブブロックのシーケンスを識別する、請求項1に記載の方法。
【請求項8】
前記長さがサブブロック数である、請求項7に記載の方法。
【請求項9】
前記長さがバイト数である、請求項7に記載の方法。
【請求項10】
上部境界が、各クラスタ内のサブブロック数上に置かれる、請求項1に記載の方法。
【請求項11】
上部境界が、各クラスタ内のバイト数上に置かれる、請求項1に記載の方法。
【請求項12】
前記データが、前記一組のデータbをb内の少なくとも1つの位置k|k+1のところで複数のサブブロックに分割することにより分割され、b[k−A+1...k+B]が所定の制約を満たし、AおよびBが自然数である、請求項1に記載の方法。
【請求項13】
前記データを格納する前記データ構造が生成されるが、前記データ自身は格納されない、請求項1に記載の方法。
【請求項14】
データを複数のサブブロックに分割するステップと、
前記サブブロックを複数のクラスタに格納するステップと、
前記一組のデータの表示を複数のスパンとして生成するステップであって、各スパンがクラスタ内のサブブロックのシーケンスを識別し、少なくとも1つのサブブロックが2つ以上のスパンにより参照されるステップとを含む一組のデータを格納する方法。
【請求項15】
前記データがデータ・ファイルである、請求項14に記載の方法。
【請求項16】
スパンのグループにより参照された前記サブブロックから前記一組のデータを再構成するステップをさらに含む、請求項14に記載の方法。
【請求項17】
前記データが、前記一組のデータbをb内の少なくとも1つの位置k|k+1のところで複数のサブブロックに分割することにより分割され、b[k−A+1...k+B]が、所定の制約を満たし、AおよびBが自然数である、請求項14に記載の方法。
【請求項18】
各クラスタが、サブブロックのディレクトリを有し、前記ディレクトリが、各サブブロックの長さ、各サブブロックのハッシュ、前記クラスタ内の各サブブロックの位置、各サブブロックに対する識別子のうちの少なくとも1つを含む、請求項1に記載の方法。
【請求項19】
前記クラスタ・ディレクトリが、前記クラスタ内に格納される、請求項18に記載の方法。
【請求項20】
前記クラスタ・ディレクトリが、前記クラスタとは別々に格納される、請求項18に記載の方法。
【請求項21】
前記クラスタ・ディレクトリが、前記クラスタが含むサブブロック数が何であれ固定長である、請求項18に記載の方法。
【請求項22】
前記クラスタ・ディレクトリが固定長であり、クラスタ・ディレクトリの固定長アレイ内に前記クラスタとは別々に格納される、請求項18に記載の方法。
【請求項23】
前記クラスタが、前記クラスタ内のサブブロックの隣接する一続きの部分間の境界を記録する、請求項18に記載の方法。
【請求項24】
クラスタ内のサブブロック間の境界が、順序付き識別子を使用することにより、および境界のところでサブブロックに隣接していない識別子を割り当てることにより識別される、請求項18に記載の方法。
【請求項25】
圧縮アルゴリズムを使用して少なくとも1つのクラスタを圧縮するステップをさらに含む、請求項1に記載の方法。
【請求項26】
圧縮アルゴリズムを使用して少なくとも1つのサブブロックを圧縮するステップをさらに含む、請求項1に記載の方法。
【請求項27】
少なくとも2つの隣接サブブロックが、圧縮アルゴリズムを使用することにより圧縮される、請求項1に記載の方法。
【請求項28】
少なくとも1つのサブブロックを前記サブブロックを含む前記クラスタにマッピングするインデックスを維持するステップをさらに含む、請求項1に記載の方法。
【請求項29】
少なくとも1つのサブブロックのハッシュを、前記サブブロックを含む前記クラスタにマッピングするインデックスを維持するステップをさらに含む、請求項1に記載の方法。
【請求項30】
前記インデックスが、前記サブブロックを含む前記クラスタ内の各サブブロックの位置を含む、請求項28または29に記載の方法。
【請求項31】
前記インデックスが、そのキーがサブブロック・ハッシュであるデジタル探索ツリーとして実施される、請求項28または29に記載の方法。
【請求項32】
前記インデックスが、Bツリーとして実施される、請求項28に記載の方法。
【請求項33】
各BLOB内の各T番目のサブブロックだけが索引され、Tが所定の正の整数である、請求項28に記載の方法。
【請求項34】
各BLOB内の各T番目のサブブロックだけが索引され、Tが所定の正の整数である、請求項29に記載の方法。
【請求項35】
前記インデックスが、1つまたは複数のハッシュ・テーブルとして実施される、請求項28に記載の方法。
【請求項36】
サブブロックに対するハッシュ・テーブル・エントリが、前記サブブロックの前記ハッシュの全部または一部を含む、請求項35に記載の方法。
【請求項37】
前記ハッシュ・テーブルがバケットを含む、請求項35に記載の方法。
【請求項38】
各スパンが、前記クラスタ内の1つまたは複数のバイトの有限シーケンスを参照する、請求項1に記載の方法。
【請求項39】
各スパンが、xバイトだけ低減する前記スパンの範囲を示す少なくとも1つのスキップ値xを含む、請求項1に記載の方法。
【請求項40】
各スパンが、xバイトだけ増大する前記スパンの範囲を示す少なくとも1つの拡張値xを含む、請求項1に記載の方法。
【請求項41】
クラスタにサブブロックを追加する前に、前記インデックスをチェックすることによりサブブロックの複製をチェックするステップを含む、請求項28に記載の方法。
【請求項42】
格納するサブブロックのハッシュを、クラスタ内の前記サブブロックのうちの少なくとも1つの前記ハッシュと比較することにより、サブブロックの複製をチェックするステップであって、インデックスが格納するサブブロックを示すステップを含む、請求項29に記載の方法。
【請求項43】
スパンが、前記サブブロックの前記ハッシュの一部または全部を使用してサブブロックを識別する、請求項1に記載の方法。
【請求項44】
Tの現在のサブブロック以下の少なくとも1つの隣接する一続きの部分が、サブブロックの記憶装置内で複製され、Tがサブブロックの所定のしきい値である、請求項1に記載の方法。
【請求項45】
Tが2である、請求項44に記載の方法。
【請求項46】
1つまたは複数のサブブロックの少なくとも1つの隣接する一続きの部分が、サブブロックの前記記憶装置内で複製される、請求項1に記載の方法。
【請求項47】
少なくとも1つのスパンXが、スパンXにより参照されたデータのコピーを参照する別のスパンにより増大する、請求項1に記載の方法。
【請求項48】
前記インデックスをクラスタ内のサブブロックXの位置の発見に使用した場合に、格納中の前記サブブロックによりサブブロックの最も長い一致する一続きの部分を発見するために、前記クラスタがサブブロックXから順方向に探索される、請求項28に記載の方法。
【請求項49】
前記インデックスをクラスタ内のサブブロックXの位置の発見に使用した場合に、格納中の前記サブブロックによりサブブロックの最も長い一致する一続きの部分を発見するために、前記クラスタがサブブロックXから順方向に探索される、請求項29に記載の方法。
【請求項50】
BLOBを2つ以上のサブブロックに分割するためのデータ処理手段と、
1つまたは複数のクラスタ内に前記サブブロックを格納するためのデータ記憶手段と、
前記BLOBをスパンの順序付きリストまたはスパンのツリーとして表示するための手段とを備え、
各スパンがクラスタ内の1つまたは複数の隣接サブブロックのシーケンスを識別し、少なくとも1つのサブブロックが、2つ以上のスパンにより参照されるデータのBLOBを格納するデータ処理装置。
【請求項51】
前記処理手段が、各サブブロックを前記サブブロックを含む前記クラスタにマッピングするインデックスを維持する、請求項43に記載のデータ処理装置。
【請求項52】
前記処理手段が、クラスタにサブブロックを追加する前に、前記インデックスをチェックすることによりサブブロックの複製をチェックする、請求項44に記載のデータ処理装置。
【請求項53】
データのBLOBを格納するためのプログラマブル・デバイスを指示するために使用することができる、コンピュータ・プログラムを表すデータで符号化したコンピュータ可読メモリであって、
前記BLOBを2つ以上のサブブロックに分割するために、前記コンピュータ可読メモリを動作するための処理手段と、
1つまたは複数のクラスタ内に前記サブブロックを格納するために、前記コンピュータ可読メモリにより使用することができるデータ記憶手段と、
前記BLOBをスパンの順序付きリストまたはスパンのツリーとして表示するための手段とを備え、各スパンが、クラスタ内の1つまたは複数の隣接サブブロックのシーケンスを識別し、少なくとも1つのサブブロックが、2つ以上のスパンにより参照されるコンピュータ可読メモリ。
【請求項54】
前記処理手段が、各サブブロックを前記サブブロックを含む前記クラスタにマッピングするインデックスを維持する、請求項53に記載のコンピュータ可読メモリ。
【請求項55】
前記処理手段が、クラスタにサブブロックを追加する前に、前記インデックスをチェックすることによりサブブロックの複製をチェックする、請求項54に記載のコンピュータ可読メモリ。
【請求項56】
プログラマブル・デバイスに、
前記BLOBを複数のサブブロックに分割する第1の機能と、
前記サブブロックを複数のクラスタに格納する第2の機能と、
前記BLOBを関連するスパンのグループとして表示する第3の機能と
を実行させるために、データのBLOBを格納するためのコンピュータ・プログラム・コード手段を備えるコンピュータ・プログラム要素であって、
各スパンが、クラスタ内の1つまたは複数の隣接サブブロックのシーケンスを識別し、少なくとも1つのサブブロックが、2つ以上のスパンにより参照されるコンピュータ・プログラム要素。
【請求項57】
第4の機能が、各サブブロックを前記サブブロックを含む前記クラスタにマッピングするインデックスを維持する、請求項56に記載のコンピュータ・プログラム要素。
【請求項58】
第5の機能が、クラスタにサブブロックを追加する前に、前記インデックスをチェックすることによりサブブロックの複製をチェックする、請求項57に記載のコンピュータ・プログラム要素。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図34】
【図35】
【図36】
【図37】
【図38】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図34】
【図35】
【図36】
【図37】
【図38】
【公表番号】特表2008−537209(P2008−537209A)
【公表日】平成20年9月11日(2008.9.11)
【国際特許分類】
【出願番号】特願2008−500011(P2008−500011)
【出願日】平成18年3月10日(2006.3.10)
【国際出願番号】PCT/AU2006/000326
【国際公開番号】WO2006/094365
【国際公開日】平成18年9月14日(2006.9.14)
【出願人】(507304845)ロックソフト リミテッド (3)
【公表日】平成20年9月11日(2008.9.11)
【国際特許分類】
【出願日】平成18年3月10日(2006.3.10)
【国際出願番号】PCT/AU2006/000326
【国際公開番号】WO2006/094365
【国際公開日】平成18年9月14日(2006.9.14)
【出願人】(507304845)ロックソフト リミテッド (3)
[ Back to top ]