(57)【要約】本発明は、データの特定のサブブロックが低冗長記憶システム内に存在するか否かを迅速に判定するための方法および装置を提供する。ある態様においては、本発明は、これを記憶システム内の各サブブロックを少なくとも１つのサブブロックがハッシュする各位置に対する「１」ビットを含むビットフィルタにハッシュすることにより達成する。このビットフィルタは、記憶システム内にサブブロックが存在するか否かを非常に迅速に判定する方法を提供する。本発明の他の態様においては、多数のランダム・アクセス読出しおよび書込み動作を１つのシーケンシャル読出し動作およびシーケンシャル書込み動作に変換するために、新しいサブブロック用のインデックス・エントリをサブブロック・インデックス書込みバッファ内にバッファすることができる。ビットフィルタと書込みバッファとを組み合わせると、メモリ内の全サブブロック・インデックスを格納するシステムが使用するよりかなり高速でないランダム・アクセス・メモリを使用する低冗長記憶システムを得ることができる。【選択図】図５
2008533571.tif 000002
【特許請求の範囲】
【請求項１】
損失を起こす方法で、記憶システム内に常駐するサブブロックの存在を表示する方法であって、
サブブロックをビットフィルタ内のある位置にマッピングする関数によりビットのアレイ（ビットフィルタ）を生成するステップであって、前記記憶システム内の少なくとも１つのサブブロックが前記ビット位置にマッピングする場合、前記ビットフィルタ内の各ビットが所定のビット値であるステップを含む方法。
【請求項２】
前記関数がハッシュ関数である、請求項１に記載の方法。
【請求項３】
前記関数が、その結果が第２の計算に入力される暗号ハッシュ関数である第１の計算により計算される、請求項１に記載の方法。
【請求項４】
前記関数が、その結果が第２の計算に入力される非暗号ハッシュ関数である第１の計算により計算される、請求項１に記載の方法。
【請求項５】
前記第２の計算がモジュロＫ演算であり、Ｋが前記ビットフィルタ内のビット数である、請求項３または４に記載の方法。
【請求項６】
前記ビットフィルタ内のビット数が２のべき乗である、請求項１に記載の方法。
【請求項７】
複数の関数があり、各関数がサブブロックを前記ビットフィルタ内のある位置にマッピングし、少なくとも１つのサブブロック／関数の組合せが前記ビットの位置にマッピングする場合だけ、前記ビットフィルタ内の各ビットが前記所定のビット値である、請求項１に記載の方法。
【請求項８】
前記ビットフィルタが、１つまたは複数のセクションに分割される、請求項１に記載の方法。
【請求項９】
１つまたは複数の各セクションが、圧縮方法を適用することにより圧縮される、請求項８に記載の方法。
【請求項１０】
前記圧縮方法が、Ｔａｎａｋａ／Ｌｅｏｎ−Ｇａｒｃｉａモード−ｍコードである、請求項９に記載の方法。
【請求項１１】
前記圧縮方法がラン・レングス符号化である、請求項９に記載の方法。
【請求項１２】
前記圧縮方法が算術符号化である、請求項９に記載の方法。
【請求項１３】
前記ビットフィルタが、１つまたは複数のセクションに分割される、請求項７に記載の方法。
【請求項１４】
１つまたは複数の各セクションが、圧縮方法を適用することにより圧縮される、請求項１３に記載の方法。
【請求項１５】
前記圧縮方法が、Ｔａｎａｋａ／Ｌｅｏｎ−Ｇａｒｃｉａモード−ｍコードである、請求項１４に記載の方法。
【請求項１６】
前記圧縮方法がラン・レングス符号化である、請求項１４に記載の方法。
【請求項１７】
前記圧縮方法が算術符号化である、請求項１４に記載の方法。
【請求項１８】
サブブロックまたはサブブロック・ハッシュを前記サブブロック記憶システム内のある位置にマッピングするインデックス・エントリを含むサブブロックのインデックスを生成するステップと、
新しく生成したサブブロック・インデックス・エントリを保持するために１つまたは複数のインデックス・エントリ書込みバッファを生成するステップとをさらに含み、
インデックス・エントリ書込みバッファの内容が、時々前記サブブロック・インデックスに書き込まれる、請求項１に記載の方法。
【請求項１９】
前記インデックスがディスク上に常駐し、前記インデックス・エントリ・バッファがメモリ内に常駐する、請求項１８に記載の方法。
【請求項２０】
前記インデックス・エントリ書込みバッファが所定のレベルまで満たされた場合に、前記インデックスがメモリ内に読み込まれ、前記インデックス・エントリ書込みバッファ内の要素がそれに追加され、次に、修正したインデックスがディスクに書き込まれる、請求項１９に記載の方法。
【請求項２１】
一組のすべての可能なサブブロックが、複数の相互に排他的なスペース内に分割され、各スペース内に入る前記記憶システム内の実際のサブブロックの有無を表示するために別々のビットフィルタが使用される、請求項１に記載の方法。
【請求項２２】
前記サブブロック・スペースの前記分割が、サブブロックをハッシュし、デジタル探索木を使用してサブブロック・ハッシュのスペースを分割することにより行われる、請求項２１に記載の方法。
【請求項２３】
前記インデックス・エントリ・バッファが対応するように分割される、請求項２１および１８に記載の方法。
【請求項２４】
前記ビットフィルタがメモリ内に位置する、請求項１８に記載の方法。
【請求項２５】
請求項１に記載の前記関数をサブブロックｚに適用し、請求項１に記載の方法により生成された前記ビットフィルタの対応するビットの値を試験することにより、前記サブブロックｚが記憶システム内に存在しないかどうかを判定するための方法。
【請求項２６】
請求項７に記載の各関数をサブブロックｚに適用し、請求項７に記載の方法により生成されたビットフィルタの対応するビットの値を試験することにより、前記サブブロックｚが記憶システム内に存在しないかどうかを判定するための方法であって、すべての試験した前記ビットフィルタのビットが、さらに所定のビット値である場合には、前記サブブロックが存在しない方法。
【請求項２７】
サブブロックのシーケンス内で、その明確な欠落に対する前記シーケンス内の各サブブロックを試験するために、請求項２５に記載の方法を使用することにより前記シーケンス内の種々の位置のところの少なくともＴ個の存在サブブロックの隣接するランが存在しないと判定するための方法。
【請求項２８】
請求項１９に記載の方法を使用して格納、通信または比較システム内にデータのＢＬＯＢを格納するための方法であって、
分割方法を使用してＢＬＯＢをサブブロックに分割するステップと、
各サブブロックが前記記憶システム内に存在しないかどうかを判定するために前記ビットフィルタを使用するステップと、
サブブロックが存在しない場合に、所定のビット値に前記サブブロックに対応するビットのアレイ内のビットを設定するステップと、
前記サブブロックに対するエントリを前記インデックス・エントリ・バッファに追加するステップとをさらに含む方法。
【請求項２９】
損失を起こす方法で、記憶システム内に常駐するサブブロックの存在を表示するためのデータ処理装置であって、
メモリ・データ記憶装置と、
サブブロックをビットのアレイ（ビットフィルタ）内のある位置にマッピングする関数を使用して、メモリ内にビットフィルタを生成するためのデータ処理手段であって、前記記憶システム内の少なくとも１つのサブブロックが前記ビットの位置にマッピングする場合だけ、前記ビットフィルタ内の各ビットが所定のビット値であるデータ処理手段とを備えるデータ処理装置。
【請求項３０】
請求項２９に記載の装置を使用してデータの１つまたは複数のＢＬＯＢを格納するためのデータ処理装置であって、
ディスク・データ記憶装置をさらに備え、
前記データ処理手段が、分割方法を使用して各ＢＬＯＢをサブブロックに分割し、サブブロックまたはサブブロック・ハッシュを前記記憶システム内のある位置にマッピングするインデックス・エントリを含む前記ディスク上にサブブロックのインデックスを生成し、前記メモリ・データ記憶装置が、新しく生成したサブブロック・インデックス・エントリを保持するための１つまたは複数のインデックス・エントリ書込みバッファを有し、前記データ処理手段が、各サブブロックが前記記憶システム内に存在しないかどうかを判定するために前記ビットフィルタを使用し、サブブロックが存在しない場合には、前記所定のビット値に、前記ビットフィルタ内のビットのアレイ内の対応するビットを設定し、インデックス・エントリ・バッファに前記サブブロックに対するエントリを追加し、メモリ内のインデックス・エントリ書込みバッファの内容が、時々ディスク上の前記サブブロック・インデックスに書き込まれるデータ処理装置。
【請求項３１】
サブブロックをビットフィルタ内のある位置にマッピングする関数を使用して、ビットのアレイ（ビットフィルタ）を生成するために、コンピュータ可読メモリを動作するための処理手段を使用して、記憶システム内に常駐しているサブブロックの存在を損失のある方法で表示するためのプログラマブル装置に指示するために使用することができるコンピュータ・プログラムを表すデータで符号化したコンピュータ可読メモリであって、前記ビットフィルタ内の各ビットが、前記記憶システム内の少なくとも１つのサブブロックが前記ビットの位置にマッピングする場合だけ、所定のビット値であるコンピュータ可読メモリ。
【請求項３２】
記憶システム内に常駐しているサブブロックの存在を損失のある方法で表すためのコンピュータ・プログラム・コード手段を備えるコンピュータ・プログラム要素であって、プログラマブル装置に、
サブブロックをビットフィルタ内のある位置にマッピングする関数を使用してビットのアレイ（ビットフィルタ）を生成するための第１の関数を実行させ、前記ビットフィルタ内の各ビットが、前記記憶システム内の少なくとも１つのサブブロックが前記ビットの位置にマッピングする場合だけ、所定のビット値であるコンピュータ・プログラム要素。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、低冗長コンピュータ・データ記憶システム内に特定のデータ片が存在するか否かを迅速に判定する方法および装置を提供する。
【背景技術】
【０００２】
従来のファイル・システムのような従来のデータ記憶システムは、いくつかのデータを名前により編成し索引（ｉｎｄｅｘ）している。これらの従来のシステムは、自身が格納しているファイルの集合体内の反復データを識別したり除去しようとしていない。従来のファイル・システムは、格納パターンにより、１，０００の異なるファイルに同じメガバイトのデータの１，０００のコピーを含んでいる場合がある。
【０００３】
低冗長記憶システムは、自身が格納しているデータをサブブロックに分割し、次に重複しているサブブロックを検出し、除去することにより同じデータの重複コピーの発生を低減している。通信および格納のためにデータをサブブロックに分割する方法については、Ｒｏｓｓ  Ｗｉｌｌｉａｍｓ（本明細書に記載の本発明の発明者でもある）の米国特許第５，９９０，１８０号に記載されていて、この方法は参照により本明細書に組み込まれる。２００６年３月１０日付けの「データ・クラスタを使用して低冗長性でデータを格納する方法」（Ｍｅｔｈｏｄ  ｆｏｒ  Ｓｔｏｒｉｎｇ  Ｄａｔａ  ｗｉｔｈ  Ｒｅｄｕｃｅｄ  Ｒｅｄｕｎｄａｎｃｙ  Ｕｓｉｎｇ  Ｄａｔａ  Ｃｌｕｓｔｅｒｓ）という名称のＲｏｓｓ  Ｗｉｌｌｉａｍｓの米国特許出願第ＸＸ／ＸＸＸＸＸ号、および２００６年３月１０日付けの「低冗長記憶システム内で索引をつける方法」（Ｍｅｔｈｏｄ  ｆｏｒ  Ｉｎｄｅｘｉｎｇ  ｉｎ  ａ  Ｒｅｄｕｃｅｄ−Ｒｅｄｕｎｄａｎｃｙ  Ｓｙｓｔｅｍ）という名称のＲｏｓｓ  Ｗｉｌｌｉａｍｓの米国特許出願第ＹＹ／ＹＹＹＹＹ号も参照により本明細書に組み込まれる。
【０００４】
低冗長コンピュータ記憶システムにおいては、各ＢＬＯＢ（バイナリ・ラージ・オブジェクト−ゼロ以上のバイト（またはビット）の有限シーケンス）は、サブブロックのプールからのサブブロックのシーケンスとして表示される。
【０００５】
図１（従来技術）は、サブブロック・インデックスにより索引したサブブロックのプール１０を示す。サブブロック１２のインデックスを維持することにより、記憶システムは、記憶システム内に新しいサブブロックがすでに存在するか否かを判定し、存在する場合には、その位置を決定することができる。次に、記憶システムは、同じサブブロックを再度格納するのではなく、既存のサブブロックへの参照を生成することができる。図２は、２つの異なるＢＬＯＢ２０、２２の表示の両方が、プール２４内の同じサブブロックを参照することができ、それによりスペースを節約する方法を示す。このように共有することにより、記憶システムは、元のデータが占有するスペースより狭いスペース内にデータを格納することができる。
【０００６】
サブブロック・インデックス２６は、各サブブロックに対するエントリを含んでいなければならない。各エントリは、サブブロックを識別する（それをすべての他のものから区別する）ための情報、およびサブブロック・プール内のサブブロックの位置についての情報を提供する。これらのエントリはかなりの量のスペースを使用する。例えば、（サブブロックの）１２８ビット（１６バイト）のハッシュが、サブブロック識別子として使用され、１２８ビット（１６バイト）のサブブロック記憶アドレスがアドレスとして使用される場合、各エントリの大きさは３２バイトである。平均サブブロック長さが１０２４バイトである場合には、このことは、インデックスは実際に格納しているデータの大きさの約３％であることを意味する。このことは、１テラバイトを含む記憶システムは、約３０ギガバイト（１ＴＢの３％）のサブブロック・インデックスを必要とすることを意味する。
【０００７】
その大きさが記憶装置の大きさの３％程度であるインデックスを維持するための要件は、インデックスをディスク上に格納する場合には、大した問題にならない。しかし、低冗長記憶システムにおいては、インデックスは非常に頻繁に参照される場合がある。何故なら、格納する新しい各ＢＬＯＢをサブブロックに分割しなければならないし、サブブロック（またはそのハッシュ）の多くをインデックス内でルックアップしなければならないからである。平均サブブロック長さが１０２４バイトである場合には、２０メガバイト・ブロックのデータを格納するには、データを約２０，４８０のサブブロックに分割し、次に、各サブブロック上でインデックス・ルックアップを行わなければならない場合がある。インデックスがディスク上にある場合には、少なくとも２０，０００ランダム・アクセス・シーク動作を行わなければならない場合があり、これは同じ数のメモリ・アクセスより遥かに遅い。インデックスがメモリ内に保持されている場合には、システムの動作は遥かに速くなる。しかし、メモリ（ＲＡＭ）は、ディスク・スペースより遥かに高価であり、ＲＡＭ／ディスク比が３％程度でなければならないという要件は、大型の記憶装置にとって面倒な場合がある。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
本発明は、メモリ内に全インデックスを保持する今説明したシステムと比較すると遥かに小さなメモリしか必要としない索引方法を提供する。
【課題を解決するための手段】
【０００９】
最初に、気が付くことは、記憶装置内にサブブロックが存在する場合と比較すると、記憶装置内にサブブロックが存在しない場合は、インデックスを迅速にルックアップすることは遥かに重要であるということである。何故なら、実際のデータの場合、大部分のインデックス・ルックアップは、欠落サブブロック（記憶装置内に位置していないサブブロック）に対して行われるからである。何故なら、存在（「一致する」）サブブロック（すなわち、記憶装置内のサブブロック）は、多くの場合、ラン（ｒｕｎ）４０中で発生するからである。図４は、サブブロック４２の一致する（「存在」）および一致しない（「欠落」）ランの代わりのシーケンスとしてモデル化する方法を示す。
【００１０】
図３は、２つの異なるＢＬＯＢ３０、３２が、サブブロックのランを提供する方法を示す。格納された第１のＢＬＯＢ３８は、サブブロックＡＢＣからなる。そのため、サブブロックＡ、ＢおよびＣを含むサブブロックのクラスタ３１がプール３６内に生成される。次に、第２のＢＬＯＢ３９が格納される。その最初の２つのサブブロックＷおよびＸは記憶装置内に含まれていないので、これら２つのサブブロックは、クラスタ（この例の場合には、新しいクラスタ３３である）内に置かれる。しかし、次の３つのサブブロックは、同じ順序で記憶装置内にすでに位置するサブブロックＡＢＣのランである。そのため、第２のＢＬＯＢの表示は、一致しているサブブロックＡ、ＢおよびＣのラン全体を参照することになる。サブブロックＷおよびＸは、インデックス内でルックアップしなければならないが、サブブロックＡが記憶装置内にすでに位置するものとして検出され、それが１つのクラスタ内で発見された場合には、インデックスを参照しなくてもＢとＣを容易に調和することができる。
【００１１】
格納するサブブロックが記憶装置内にすでに存在することが分かった場合には、次のいくつかの（数百の場合もある）サブブロックも存在し、一致するサブブロックの直後に見出されることが多い。それ故、一致しているサブブロックのランの残りを、インデックスをルックアップしないで格納することができる。各入りサブブロックは、インデックスを参照しないで、サブブロックの一致するラン内の次のサブブロックと比較することができる。一致するランが終了した場合だけ、インデックスが再度必要になる。
【００１２】
対照的に、欠落サブブロック（すなわち、記憶装置内に存在しないサブブロック）のラン中（記憶装置内のサブブロックのある重複許容されない場合）、各単一のサブブロックに対してインデックス・ルックアップを行わなければならない。
【００１３】
この分析は、データの冗長度のレベルが何であれ、大部分のインデックス・ルックアップ動作は、記憶装置内に存在していないサブブロックに対するものであることを示唆している。それ故、本発明は、これらのルックアップの最適化に焦点を当てる。
【００１４】
２番目に気が付くことは、ルックアップが失敗した場合には、インデックスからそれ以上の情報を必要としないことである。サブブロックが存在する場合には、インデックスはサブブロックに対する格納位置を形成する。しかし、サブブロックが存在しない場合には、それ以上の情報は必要ない。サブブロックを記憶装置内のクラスタに単に書き込むことができ、索引することができる。それ故、インデックス・ルックアップの大部分に対して、インデックスの唯一の要件は、サブブロックが存在しないことを確認することである。
【００１５】
３番目に気が付くことは、どの欠落サブブロックのインデックス・ルックアップも迅速に行う必要がないことである（特に、メモリ対ディスク・アクセスに関して）。大部分のルックアップを迅速に行うことができる場合には、インデックスの速度は大幅に改善される。
【００１６】
メモリ内に全インデックスを保持する必要がない本発明の場合には、これらの発見を考慮に入れる。
【００１７】
本発明のある態様においては、インデックスはディスク上に常駐していて、ビットフィルタ１３０がメモリ内に維持されている。ビットフィルタは、すべて「０」で始まるビットのアレイである。各サブブロック１３２を格納すると、ビットフィルタ内に位置を形成するためにその内容がハッシュされ１３４、そこのビットが「１」に設定される。そのビットがすでに「１」である場合には、そのビットは「１」のままである。サブブロックがマッピングされないビットフィルタ内の位置は、「０」のままである。図１３は、４つのサブブロックをビットフィルタ内の４つの位置にハッシュする方法を示す。対向するデジタル値を使用することができる。この場合、「１」は便宜上所定のビット値として使用される。
【００１８】
大部分の実施形態が、（例えば、比較のために）任意の方法で（暗号ハッシュを使用して）サブブロックをハッシュする場合が多いので、サブブロックのハッシュをビットフィルタへの２次ハッシュのための基準として簡単に使用することができる。図５は、この２つのステップのプロセスを示す。例えば、ビットフィルタが１０２４ビットを有している場合には、サブブロック５０を、ＭＤ５ハッシュ・アルゴリズムを使って１２８ビットのハッシュにハッシュ５２することができ、ハッシュの最初の１０ビットを、インデックスを０から１０２３のビットフィルタ５４に形成するために使用することができる。図１４は、第１のハッシュ１４０が非暗号化または暗号化であり、ビットフィルタ・ハッシュ関数１４２が、第１のハッシュの結果の一部または全部上のモジュロ動作からなるより一般的な実施形態を示す。
【００１９】
このようなビットフィルタ内でのビット設定の結果、ビットフィルタは格納されたサブブロックのレコード含むことになる。このレコードは（ビットフィルタが各可能なハッシュに対して少なくとも１つのビットを含んでいない場合は）損失を生じる。任意の実際的なビットフィルタの大きさに対して、このことは、入りサブブロックのうちのいくつかが同じビットにマッピングされることを意味する。このことは、一方が存在するものであり、一方が存在しないものである２つのサブブロック６０、６２が同じビット１６４にマッピングされ、そのビットがオン１６６になると、欠落サブブロックのルックアップが、サブブロックが存在するという不正確な表示をすることを意味する。図６は、このような衝突を示す。これらのビットフィルタの衝突は、正確さに悪影響を与えない。何故なら、サブブロックがある位置にハッシュされ、そこで「１」を発見した場合には、サブブロックが本当にそこに存在するのか否かをチェックするためにインデックスがルックアップされる。
【００２０】
ビットフィルタ内で新しいサブブロックが既存のサブブロックと衝突する可能性は、ビットフィルタの密度（ビットの全数で割った「１」ビットの数）と同じであり、スパース・ビットフィルタに対するこの密度は、ビットフィルタ内のビット数に対する格納しているサブブロックの比率とほぼ同じである。密度は、１／Ｄで表される。ビットフィルタの大きさは設計の際に選択されるので、密度も設計の際に選択され、そのため、サブブロックの「衝突」の頻度を任意の所望のレベルに下げることができる。それでも、衝突は任意の実際の実施形態で発生する恐れがあり、ビットフィルタ内のビット数は、可能なサブブロック・ハッシュ値の数より小さい。
【００２１】
しかし、ビットフィルタは１つの重要な確実性を保持している。サブブロックがビットフィルタ内でビットにハッシュされると、ビットは０になり、その場合、サブブロックは確実に記憶装置から除去される。これは重要な特性である。何故なら、データ構造は、最も普通の場合（欠落サブブロックの場合）に確実性を提供するからである。
【００２２】
要するに、インデックスはディスク上に常駐しているが、ビットフィルタはメモリ内に常駐している。格納するデータは分割方法によりサブブロックに分割され、最初のサブブロックはビットフィルタ内でルックアップされる。ビットが「０」である場合には、サブブロックは確かに記憶装置内には存在しないで、記憶装置に書き込むことができ、索引することができる（そしてそのビットフィルタは「１」に設定される）。ビットが「１」である場合には、サブブロックは記憶装置内に存在している場合もあるし、存在していない場合もあり、ディスク上のインデックスを確認のためにチェックすることができる。サブブロックが存在する場合には、１つまたは複数のサブブロックの一致するランが存在する。各一致するランは、（ラン内の第１のサブブロックに対して）１回だけのインデックス・ルックアップを必要とし、各欠落サブブロックは、確率１／Ｄ（ビットフィルタ密度）でインデックス・ルックアップを必要とするので、密度を低く維持する限りは、インデックスを必要とする場合は比較的少ない。
【００２３】
残りの問題は、サブブロックのビットが「０」である場合でもサブブロックを依然としてインデックスに追加しなければならない場合のインデックスの更新である。各サブブロックに対してディスク上のインデックスにランダム・アクセス読出しおよび書込みを行う明白な方法は、明らかに非効率的である。
【００２４】
本発明のさらに他の態様においては、ビットフィルタは、メモリ常駐１２０インデックス・エントリ書込みバッファと組み合わされる。サブブロックをインデックスに追加すると、代わりにバッファ１２２に追加される。これはディスク１２４上のインデックスにランダム・アクセス書込みを行うよりも遥かに速い。図１２は、ビットフィルタ１２６と、インデックス・エントリ書込みバッファ１２２と、サブブロック・インデックス１２８との間の関係を示す。
【００２５】
バッファが十分に満たされた場合には、バッファ内エントリをソートし（またはこれらエントリをソートした状態に維持し）次に、インデックスの次の部分がメモリ内に呼み出されるインデックスを通して１回シーケンシャルに通過することにより、バッファはディスク１２４のインデックス１２８にフラッシュされる１２１、その部分で失敗したバッファ内のエントリはマージされ、次に、この部分はディスク上のインデックスに書き戻される。このようにして、数百のランダム・アクセス読出し／書込みＩＯ動作のペアが、メモリ内に全インデックスを保持しなくても、（ランダム・アクセス動作よりも速い）１回のシーケンシャル読出し動作および１回のシーケンシャル書込み動作に変換される。
【００２６】
フラッシュされなかったバッファの内容は、効果的にインデックスの一部を形成するので、インデックスを探索するたびにそれを探索しなければならない。しかし、そうしてもシステムの速度は遅くならない。何故なら、バッファはメモリ内に位置するからである。
【００２７】
このバッファ・アプローチの１つの問題は、バッファが満杯になった場合、フラッシュされている間すべてのものがストップすることである。このことはリアルタイム・システムの場合には不利である。本発明のさらに他の態様においては、インデックス７０およびバッファ７２はセクションに分割され、各セクションは別々にバッファされる（図７）。これにより、全バッファを一度に全部フラッシュさせる必要がなくなる。本発明のさらに他の態様においては、ビットフィルタは、同様に、対応するセクションに分割される。
【００２８】
本発明のさらに他の態様においては、ビットフィルタは、ビットフィルタ圧縮方法により圧縮される。そうすることにより、特にビットフィルタの密度が低い場合に、メモリの消費を大幅に低減することができる。
【００２９】
本発明のさらに他の態様においては、格納しているデータの少なくともＴ個の連続するサブブロックに対してビットフィルタが「１」を発生した場合だけ、サブブロック・インデックスがルックアップされる（ここで、Ｔは正の整数のしき値である）。通常の場合には、Ｔ＝１と設定される。Ｔをより高い値に設定すると、Ｔ個のサブブロックより少ないサブブロックのすべての一致するランが、これらのサブブロックが欠落サブブロックであるかのように記憶装置内で複製されるが、サブブロックの格納がスピードアップし、フラグメンテーションが低減する。１／Ｄがビットフィルタの密度である場合には、Ｔ＝２に設定すると、「偽陽性」（サブブロックがビットフィルタ内の「１」ビットにハッシュするが、次に記憶装置から削除されたことが発見される）の確率が１／Ｄから１／Ｄ２に低減する。
【００３０】
本発明のさらに他の態様においては、Ｔを１より大きい値に設定した場合、各Ｔ番目のサブブロックだけが索引されるが、（一致するラン内に位置していない）各サブブロックがビットフィルタ内でルックアップされ（そして、「１」ビットが存在する場合には、インデックスへのアクセスも行われる）。記憶装置内にサブブロックが存在する場合には、一致するサブブロックに先行する記憶装置内のＴ−１個のサブブロックが、一致するサブブロックに先行するサブブロックと比較され、一致した場合には、これらのサブブロックは一致するランの一部として結合される。図１８は、ＢＬＯＢ  ＢＬＯＢ１  １８０が、索引中の各３番目のサブブロックだけと一緒に格納されている、Ｔ＝３の一例である。ＢＬＯＢ２  １８２を格納すると、その各サブブロックがビットフィルタ内でルックアップされる。サブブロックに対する結果が１である１８４場合には、インデックス内でサブブロックがルックアップされ、サブブロックがクラスタ１８６内に存在すると判定された場合には、隣接する一致するサブブロックに対する探索１８８は、一致するサブブロックから後方および前方の両方に進む。この例の場合には、ＢＬＯＢ２内のサブブロックＢおよびＣは、ＢＬＯＢ１内に含まれていて、すでに記憶装置内に存在するが、これらのサブブロックが（ＢＬＯＢ２のために）処理される場合には、一致は検出されない。何故なら、ＢＬＯＢ１を格納した場合に、サブブロックＢおよびＣは索引されない（ビットフィルタに追加される）からである。しかし、サブブロックＤがビットフィルタ内でルックアップされた場合には、結果は１になり（何故なら、このサブブロックは、ＢＬＯＢ１を格納した場合に索引されたからである）、それ故、サブブロックＤはインデックス内でルックアップされ、サブブロック・プール内のクラスタ内で発見される。サブブロックＤのこの一致が確立すると、後方に（Ｔ−１（この場合２である）まで）探索が行われ、サブブロックＢおよびＣが一致することは発見される。サブブロックＤから前方に探索すると、サブブロックＥが一致するが、サブブロックＹが一致しないことが分かる。この最終的な結果は、サブブロックＢＣＤＥのランの比較が行われたことである。
用語
欠落サブブロック：記憶装置内に存在しないサブブロック。
【００３１】
ビットフィルタ：サブブロックの有無を記録するために使用するビットのアレイ。
【００３２】
ビットフィルタの衝突：記憶装置内に格納している２つ以上のサブブロックが同じビットフィルタ位置にハッシュするとビットフィルタ衝突が発生する。
【００３３】
ビットフィルタ密度：ビットフィルタ内のビットの全数で割ったビットフィルタ内の「１」ビットの数である範囲［０，１］内の値。
【００３４】
ＢＬＯＢ（バイナリ・ラージ・オブジェクト）：データのゼロ以上のバイト（またはビット）の有限シーケンス。その名前にも関わらず、ＢＬＯＢは必ずしも大きくはない。ＢＬＯＢは、数ビットのように小さいものであってもよいし、またはギガバイトのように大きいものであってもよい。
【００３５】
ＢＬＯＢフラグメンテーション：記憶システム全体を通してＢＬＯＢの格納が散乱している範囲。
【００３６】
バッファ：インデックス・エントリ書込みバッファ参照。
【００３７】
衝突：ビットフィルタ衝突参照。
【００３８】
暗号ハッシュ：反転するのが計算上実行不能となるように設計されたハッシュ関数。
【００３９】
密度：ビットフィルタ密度参照。
【００４０】
ディスク：コンピュータが使用するランダム・アクセス記憶媒体。通常、「ディスク」という用語は、磁化したデータを保持している金属の回転円盤（ハードディスク）を意味する。本明細書においては、ディスクという用語は、メモリよりかなり遅いランダム・アクセス記憶媒体を意味するようにもっと広義に解釈することができる。
【００４１】
偽陽性：欠落サブブロックが「１」を保持するビットフィルタ内のある位置にハッシュすると、偽陽性が発生する。
【００４２】
ハッシュ：ハッシュ・アルゴリズムが生成したバイト（またはビット）の固定長シーケンス。サブブロックのハッシュは、サブブロックを索引し、比較するためのサブブロックを表すものとして使用することができる。
【００４３】
ハッシュ・アルゴリズム：バイト（またはビット）の有限シーケンスを受け入れ、入力シーケンスに高度に依存するバイト（またはビット）の有限シーケンスを生成するアルゴリズム。通常、ハッシュ・アルゴリズムは、特定の固定長の出力を生成する。ハッシュ・アルゴリズムは、シーケンスを直接比較しなくても、データの２つのシーケンスが同じであるか否かをチェックするための試験に使用することができる。実際に暗号ハッシュを使用すれば、そのハッシュが同じである場合、２つのサブブロックが同じであると結論することができる。
【００４４】
サブブロックのハッシュ：サブブロック・ハッシュ参照
インデックス：サブブロック・インデックス参照
インデックス・バッファ：インデックス・エントリ書込みバッファ参照。
インデックス・エントリ：サブブロック・インデックス内のレコード。ある実施形態の場合には、インデックス・レコードは、インデックス・キーおよびインデックス値を含む。ある実施形態の場合には、インデックス・レコードは、インデックス・キーの一部およびインデックス値を含む。ある実施形態の場合には、インデックス・レコードはインデックス値だけを含む。ある実施形態の場合には、インデックス・レコードは値を含まないで、キーの一部または全部を含む。
【００４５】
インデックス・エントリ書込みバッファ：ゼロまたはサブブロック・インデックスの一部を形成するが、ディスク上のインデックスにまだ書き込まれていないもっと最近追加したインデックス・エントリを保持するメモリ内のバッファ。
【００４６】
インデックス・キー：サブブロックについての情報を検索するためにサブブロック・インデックスに提供されるサブブロックについての情報。ある実施形態の場合には、この情報はインデックス・エントリの位置を発見し、読み出すことにより検索される。
【００４７】
インデックス・ルックアップ：インデックス・エントリにサブブロック（またはサブブロックのハッシュ）をマッピングする動作。インデックス・エントリは、ディスク上のサブブロックの位置についての情報を提供する。
【００４８】
インデックス値：サブブロック（またはその一例がそのハッシュであるサブブロックの派生物）をインデックスでルックアップした場合に、インデックスによりサブブロックについて生成された情報。ある実施形態の場合には、この値は、ディスク上のサブブロックの位置からなる。他の実施形態の場合には、インデックスの唯一の目的がキーの有無を記録することである場合には、値が存在しない場合がある。
【００４９】
メモリ：通常、ランダム・アクセス・メモリ（ＲＡＭ）を参照するコンピュータが使用するランダム・アクセス記憶媒体。本明細書においては、この用語は、「ディスク」よりかなり速いランダム・アクセス記憶媒体を意味するようにもっと広義に解釈することができる。
【００５０】
分割方法：ＢＬＯＢ内の各バイト（またはビット）が、正確に１つのサブブロック内に入るように、ＢＬＯＢを１つまたは複数のサブブロックに分割するための方法。
【００５１】
存在サブブロック：記憶装置内に存在するサブブロック。
【００５２】
低冗長記憶装置：データのその表示の際に、自身が格納している一組のデータ内の複製データのいくつかを除去する記憶システム。
【００５３】
記憶装置：低冗長記憶装置参照。
【００５４】
サブブロック：索引、比較および／または冗長除去のための単位として識別されたバイト（またはビット）のシーケンス。ＢＬＯＢはサブブロックに分割することができる。
【００５５】
サブブロック・ハッシュ：サブブロックへのハッシュ・アルゴリズムの適用結果。サブブロックのハッシュは、例えば、サブブロックを索引および／または比較するために、サブブロックを表すものとして使用することができる。
【００５６】
サブブロック・インデックス：サブブロックの位置（例えば、制限なしで、クラスタ番号（およびまた、おそらくサブブロック識別子））に、サブブロックのハッシュ（またはサブブロック自身）をマッピングする（または他の方法で関連付ける）データ構造。
【００５７】
サブブロック・プール：低冗長記憶システム内のサブブロックの集合体。
【００５８】
書込みバッファ：インデックス・エントリ書込みバッファ参照。
【００５９】
本明細書および添付の特許請求の範囲全体を通して、他に別段の指定がない限り、「備える」および「含む」という用語、並びに「備えている」および「含んでいる」というような派生語は、上記の完全なものまたは完全なもののグループを包含するが、任意の他の完全なものまたは完全なもののグループを除外しないことを理解されたい。
【００６０】
本明細書の添付の特許請求の範囲は、本明細書に記載する本発明の広義の記述であり、参照により本明細書に組み込まれる。
【００６１】
本明細書での任意の従来技術への参照は、このような従来技術が共通の一般的知識の一部を形成しているという容認でもなければ、任意の形式の示唆でもないし、またそのように解釈すべきでもない。
【００６２】
添付の図面を参照しながら、以下に本発明の特定の実施形態についてさらに詳細に説明する。これらの実施形態は、説明のためのものであって、本発明の範囲を制限するためのものではない。他の実施形態の示唆および記述を本発明の範囲内に含めることができるが、これらのものは添付の図面には示していないし、または別の方法で本発明の機能を図面には示してあるが本明細書には記述していない。
【発明を実施するための最良の形態】
【００６３】
６．１  分割方法
データをサブブロックに分割するために種々の方法を使用することができる。これらの方法としては、（データがＮバイトのサブブロックに分割される）固定長分割、およびデータがその位置に近いバイト（またはビット）がある所定の制約を満たす位置のところで可変長サブブロックに分割される可変長分割等がある。Ｗｉｌｌｉａｍｓ  Ｒの米国特許第５，９９０，８１０号に、可変長分割方法が詳細に記載されている。
６．２  サブブロックのハッシュ
少なくとも２つのタイプのハッシュ方法を使用することができる。
【００６４】
最初に、記憶システムは、サブブロックを固定長ハッシュにハッシュするので、サブブロックをより容易に索引し、操作することができる。好適には、このハッシュ動作は、そのハッシュを比較することにより、サブブロックの機密保護比較を行うことができるように暗号ハッシュにより行うことが好ましい。暗号ハッシュ・アルゴリズムの例としては、ＭＤ５（１２８ビット（１６バイト）値を生成する）およびＳＨＡ−１（１６０ビット（２０バイト）値を生成する）等がある。
【００６５】
次に、サブブロック・ハッシュ（またはおそらくサブブロックだけ）はビットフィルタ内のある位置にハッシュされる。この動作は、ビットフィルタ内で衝突が予想されるので暗号化強度を必要としない。それ故、ハッシュ動作は、種々の方法のうちの１つを使用して行うことができる。ビットフィルタ位置にサブブロックをハッシュする１つの簡単な方法は、サブブロック・ハッシュのＫ個（あるＫに対して）のビットを取り、剰余を得るためにＢ（ビットフィルタ内のビット数）によりその値を割る方法である（モジュロ関数）。この剰余は、サブブロック位置として使用される。この方法は、２ＫがＢより高い少なくとも１つの次数である限りは、ビットフィルタをかなり均一にロードしなければならない。
【００６６】
ビットフィルタ内のビット数が２のべき乗である場合には、底部のＫ個のビットを単に取ることによりモジュロ関数を実行することができる。
６．３  ビットフィルタの重要な特性
ビットフィルタの最も重要な特性は、サブブロックが「１」ビットにハッシュした場合、ビットフィルタが存在していても存在していなくてもよいことであるが、サブブロックが「０」にハッシュした場合には、サブブロックは記憶装置内に絶対存在しないということである。ビットフィルタを有用にしているのはこの確実性である。
６．４  ビットフィルタの密度とサイズ
ビットフィルタのサイズはどのくらいの大きさであるべきか？「１」ビットが所与の数である場合、ビットフィルタが大きければ大きいほど、メモリの消費量は大きくなるが、密度（ビットフィルタ内のビットに対する「１」ビットの比率）は小さくなる。ビットフィルタが小さければ小さいほど、メモリの消費量は少ないが、密度は大きくなる。それ故、メモリの消費量とビットフィルタの密度の間にはトレードオフがある。
【００６７】
メモリの消費は、明らかに望まいものではない。何故なら、低冗長記憶システムが使用するメモリの低減が、ビットフィルタを導入する一番の理由であったからである。それ故、ビットフィルタはあまり大きくすべきではなく、またはそのサイズそのものがその目的をダメにするからである。
【００６８】
ビットフィルタの密度も重要である。何故なら、ビットフィルタの密度が、偽陽性イベントの比率を決定するからである。これらのものは、記憶装置内にまだ存在しないサブブロックが、ビットフィルタ内にハッシュされ、そこに「１」が存在する場合に発生する（何故なら、それはある他のサブブロックにより設定されたものであるからである）。このことが発生すると、記憶装置は、サブブロックが本当に存在するのか否かをチェックするためにディスク上のインデックスにアクセスする（そしてそれが存在しないと判定する）。ビットフィルタの平均密度がＤ個のビットごとに「１」である場合には、偽陽性率は１／Ｄである。
【００６９】
偽陽性率とメモリ消費量との間のトレードオフは、このような要因をメモリのコストおよび平均サブブロック長さとして考慮することにより、特定の用途についてのより多くの情報を知って始めて行うことができる。
６．５  ビットフィルタの成長
ビットフィルタのサイズをどのように選択したにせよ、その密度は時間の経過ととも増大する。何故なら、サブブロックがインデックスに追加されるからである。密度があまり大きくなると、偽陽性率を低減するためにビットフィルタのサイズを増大することができる。
【００７０】
ビットフィルタ内の情報だけを使用してビットフィルタのサイズを増大するために明確な方法はないように思われる。何故なら、各「１」ビットは、「１」に設定する１つまたは複数のサブブロックの設定についての情報を含んでいないからである。代わりに、インデックス内の情報から新しい大きなビットフィルタを構成することができる。このことは、メモリ内に新しい大きなビットフィルタを準備し、それをすべて「０」に設定し、次にインデックスを通してシーケンシャルなパスを１回行い、各エントリをビットフィルタ内のビットにハッシュし、次にそれを「１」に設定することにより行うことができる。
【００７１】
インデックスを通してパスをシーケンシャルに行うことができたとしても、依然として時間のかかる動作であることが多い。ある実施形態の場合には、インデックスは数ギガバイトになる場合がある。リアルタイムの制限時間を有するシステム内で全インデックスを再度読出すのは、シーケンシャルに行う場合でも望ましくない。
【００７２】
１つの解決方法は、背景内に新しいビットフィルタを準備するという方法である。既存のビットフィルタの密度があまりに高くなった場合には、メモリ内に大きなビットフィルタを準備することができる。背景プロセスは、全インデックスを順次読み出すことができ、新しいビットフィルタを準備することができる。この動作が完了すると、古いビットフィルタを廃棄することができる。新しいビットフィルタの生成プロセス中に、すべての新しいサブブロックは、古いビットフィルタおよび新しいビットフィルタ両方内のビットを設定しなければならない。そのため、この動作の開始の後で到着するサブブロックは、依然として新しいビットフィルタ内に表示される。しかし、この解決方法の一部により、交換中にメモリ使用に追加のスパイクが発生する場合がある。
【００７３】
もっといい解決方法は、インデックスをセクションに分割し、各セクションに対して別々のビットフィルタを維持する方法である。次に、特定のセクションに対するビットフィルタの密度があまりに高くなった場合には、このビットフィルタを他のセクションのビットフィルタから独立して拡張することができる。この方法は、特に、ハッシュ・テーブル８０のツリーであるインデックスのような成長のためにそれ自身が組織されたインデックスと協力してうまく動作することができる。この場合、ビットフィルタを、各ハッシュ・テーブル８２と関連付けることができ、ハッシュ・テーブルを分割した場合には、分割することができる。図８は、メモリ８８内に各葉がそれ自身のビットフィルタおよびインデックス８４エントリ・バッファを保持するツリーを示す。ディスク８６上には、各葉に対応するハッシュ・トラフィック０が位置する。図１５も類似の図面であって、二分木１５２に関連するサブブロック・ハッシュ１５０値を示す。
６．６  インデックス・エントリ書込みバッファ
種々の方法によりインデックス・エントリ書込みバッファを実施することができる。バッファにインデックス・エントリを追加することができるものでなければならないし、ある実施形態の場合には、バッファを探索するための要件がある場合がある。
【００７４】
バッファがインデックスの１つのセクションだけに対応している場合には、バッファはそんなに大きくはならない。このような場合には、必要な場合には、インデックスを探索するために線形探索を使用して、簡単な順序通りでないリストでこのジョブを行うことができる。バッファはメモリ内に位置しているので、線形探索はかなり速い。
【００７５】
バッファが大きい場合には、そのエントリを迅速に探索することができるように、そのエントリをソートされた順序に、またはある種のツリーまたはハッシュ・テーブル・データ構造に維持しなければならない。
【００７６】
記憶システムがＢＬＯＢの削除をサポートする場合には、インデックス・エントリ書込みバッファは、削除または挿入をバッファしなければならない場合がある。
６．７  偽陽性
ビットフィルタを使用した場合の１つの問題は、「偽陽性」の問題である。この場合、サブブロックはビットフィルタ内の「１」ビットにハッシュするが、インデックスにアクセスした場合に、サブブロックが記憶装置内に存在しないことが分かる。ビットフィルタの密度が１／Ｄである場合には、これらの偽陽性が、Ｄ個の欠落サブブロックごとに平均１回発生する。偽陽性は、ディスク上のインデックスに対してランダム・アクセス読出しを行う恐れがある。
【００７７】
実験の結果、かなりの量の新しいデータを格納しているシステムにおいて、偽陽性がシステムの性能の制限要因の１つになり始めるランダム・アクセス・ディスク動作を低減するのに、ビットフィルタおよびインデックス・エントリ書込みバッファの組合せが非常に有効であることが分かっている。Ｄ＝１００の場合でも、１００のサブブロックごとに平均１回発生するランダム・アクセス・シークは、性能分析の際に非常に重要な役割を持つ。
【００７８】
この時間のハンデを低減する最も簡単な方法は、ビットフィルタの密度を低減するという方法である。例えば、Ｄが１００から２００に増大した場合には、コストは半分になる。これは有効なオプションであり、特に有効な場合がある。何故なら、ビットフィルタのサイズは２倍になっても、ビットフィルタの圧縮したサイズは、２倍以下にしか増大しないからである（何故なら、低いエントロピーのビットフィルタは、より圧縮することができるからである（図１１）。
【００７９】
もう１つのアプローチは、平均サブブロック長さを増大する方法である。平均サブブロック長さ（１Ｋ〜１６Ｋの範囲内）を増大すると、通常、データ低減の範囲を除いて種々の性能測定基準が改善される。例えば、平均サブブロック長さが２倍になると、ビットフィルタ密度が半分になる。
６．８  短い一致するランのスキップ
偽陽性を低減するためのより興味のあるアプローチは、ＢＬＯＢフラグメンテーション中に、偽陽性をアドレス指定する方法である。ＢＬＯＢが格納されていて、そのサブブロックが記憶装置内で発見されない場合には、サブブロックは、通常、記憶装置内に順次書き込まれる。しかし、サブブロックが一致した場合には、システムは、１つまたは複数の一致するサブブロックのランを処理しなければならない。そのランが非常に短い場合には、ＢＬＯＢの表示は、スペースをほんの少し低減するためにフラグメント化される。図９の場合には、１つのサブブロックＣが記憶装置内にすでに存在するという理由だけで、ＢＬＯＢ２９０の表示は３つの部分９１、９２、９３に分割される。
【００８０】
フラグメンテーションを増大するが、格納の低減を大きく改善しない一致する短いランを回避するために、Ｔ個のサブブロックのサブブロック一致しきい値を供給することができる。一致するラン（存在サブブロック）に遭遇したが、それがＴ−１個のまたはそれ以下のサブブロックである場合には、（存在）サブブロックは、フラグメンテーションを低減するために記憶装置内に複製される。図１０は、サブブロックＣを２回格納することにより、フラグメンテーションをなくし、ＢＬＯＢ２  １００を１つのクラスタ１０２内のサブブロックにより表示する方法を示す。この技術の動機は、任意のビットフィルタの偽陽性により左右されないことに注目するのは重要なことである。このアプローチは、いくつかのサブブロックを複数回格納する場合があるが、使用する追加のスペースは、ディスク・スペースだけであり、この技術は、フラグメンテーションを低減することができ、それによりＢＬＯＢ検索回数を低減することができる。
【００８１】
デフラグメンテーション上の理由で、（通常のシステムを表す）１つのサブブロックより大きいしきい値Ｔの値を使用する場合には、偽陽性のコストを低減するためにこのシナリオを使用することができる。例えば、Ｔが２である場合で、一致しないサブブロックの後で、ビットフィルタ内の「１」ビットにハッシュするサブブロックに遭遇した場合には、次のサブブロックもビットフィルタ内の「１」ビットにハッシュしない限りは、インデックスをルックアップする必要はない。一般に、しきい値を使用すると、（サブブロックごとの）偽陽性の確率が１／Ｄから（１／Ｄ）Ｔに低減する。Ｄ＝１００の場合には、これにより、偽陽性の頻度は１００回に１回から１０，０００回に１回に低減する。これは非常に大幅な低減である。
【００８２】
ビットフィルタ内で「０」にマッピングするサブブロックは、記憶装置内に存在しないことが保証されるので、Ｔ個のサブブロックのいくつかのランを除くすべてをＴ個の存在サブブロックの候補ランとして除外するためにビットフィルタを使用することができる。図１６は、３つ（Ｔ＝３）以上の存在サブブロックの隣接するランだけが特別に処理される（すなわち、すでに存在するサブブロックへの参照として格納される）様式の下で格納中のサブブロック１６０のシーケンスを示す。「０」にマッピングする任意のサブブロックは、Ｔ個の存在サブブロックのランの一部となることはできない。それ故、ビットフィルタは、インデックスにアクセスすることにより、もっと完全に試験することができるいくつかの候補ランを除くすべてのものを除外することによりＴ個以上の存在サブブロックの隣接するランの探索を助ける。
６．９  各サブブロックに対する複数のビットの設定
偽陽性率を低減するためのもう１つの方法は、ビットフィルタ２０２内のＮ個の位置（ここで、Ｎは小さな正の整数）に各サブブロック２００をマッピングし、ビットをＮ個すべての位置に設定するという方法である。このことはＮ個の異なるハッシュ関数２０４を使用することにより達成することができる。図２０は、３つの異なるハッシュ関数（Ｈ１，Ｈ２，Ｈ３）を使用して、１つのサブブロック２００をビットフィルタ内で３つの位置にハッシュし、３つのビットを設定する方法を示す。
【００８３】
サブブロック２１０を試験するために、サブブロックはＮ個の異なるハッシュ関数２１２によりハッシュされ、ビットフィルタ内の対応するビットがルックアップされる。結果は、サブブロックが決して存在しない２１６場合には「０」であり、存在するかもしれない２１８場合には「１」である１つの結果ビットを生成するために論理積がとられる２１４（図２１）。
【００８４】
各サブブロックに対するＮ個のビットを設定すると、（スパース・ビットマップに対する）Ｎの係数程度でビットフィルタ内の密度が増大する。Ｎ＝３の様式の下で、Ｎ＝１の百万のビットフィルタが１０００のビットセットおよび０．００１の密度を有している場合には、その密度は３倍の約０．００３になる。しかし、偽陽性の確率は、０．００１から約２．７×１０−８である０．００３３に急落する。この例は、Ｎが増大するとビット密度には線形効果があるが、偽陽性率には指数的影響があることを示す。
６．１０  ビットフィルタの圧縮
偽陽性率を低くするために、ビットフィルタはまばらでなければならないし、ビットフィルタがまばらだと、エントロピーは低くなり、大きく圧縮することができる。さらに、ビットフィルタ内でビットが設定される無秩序な方法のために、ビットフィルタは、メモリレス２進乱数発生装置の出力を、「１」の１／Ｄの確率、および「０」の（Ｄ−１）／Ｄの確率で近似する（ここで、Ｄはビットフィルタの密度である）。このことは、データの複雑なモデルを構成しなくても圧縮を行うことができることを意味する。最も重要なことは、ビットフィルタの密度が分かっている限り、（データの大きな圧縮片に関連して）圧縮損失なしで、その個々の小片を個々に圧縮することができることである。
【００８５】
圧縮フィールドは、メモリレス２値ソースを圧縮するための種々様々な技術を提供する。下記のいくつかの節においては、この中のいくつかについて説明する。
６．１１  ラン・レングス符号化ビットフィルタ圧縮
ビットフィルタを圧縮するための１つの簡単な技術は、（「０」が「１」より多いソースに対する）「０」ビット・ランの長さである数のシーケンスとしてビットフィルタが表示されるラン・レングス符号化である。種々のラン・レングス符号化方法は、主としてこれらの方法がラン・レングスを表示する方法において異なる。
【００８６】
ラン・レングス符号化の１つの簡単な形式は、固定幅の長さを使用する方法である。例えば、１バイトの幅（８ビット長）を選んだ場合には、「１」ビットが後に続く４７の「０」ビットのランは、バイト値（少数）４７により表される。
【００８７】
「０」ビットのランを２５５より長くすることができるように、値２５５を、それに続く４つのバイトが、実際の長さであることを意味する特殊コードとして予約することができる。これによりコードは、最高２３２−１個の「０」ビットのランを表すことができる。もっと長いランを表すことが必要な場合には、実際の長さが後に続く８バイト内に含まれていることを表示するために、４バイト値内に特殊コード（例えば、ＦＦＦＦＦＦＦＦ）を定義することができる。「０」で終わる１ビット・ブロックを、いつでも最後の「１」ビットを切り捨てる規定を採用することにより、または長さを記録することにより表示することができる。
【００８８】
バイトを長さとして選択する利点は、メモリからロードするのが非常に容易であることである。
６．１２  ＴａｎａｋａおよびＬｅｏｎ−Ｇａｒｃｉａビットフィルタ圧縮
ＴａｎａｋａおよびＬｅｏｎ−Ｇａｒｃｉａによるラン・レングス符号化の特定の形式を使用すれば、ラン・レングス符号化の簡単さを保持しながら非常に効率的な圧縮を行うことができる。
【００８９】
Ｔａｎａｋａ／Ｌｅｏｎ−Ｇａｒｃｉａモード−ｍコードは、ビット列「ｍ個のビットとしての２進で、１＜ｋ」により「１」ビット（但し、ｋ＝０．．２ｍ−１）が後に続くｋ個の「０」ビットのラン、および２ｍ個の「０」ビットのランをビット列「０」にマッピングする。それ故、モード３コードは、ビットを下記のようにマッピングする。
【００９０】
入力 出力
００００００００      ０
１                    １０００
０１                  １００１
００１                １０１０
０００１              １０１１
００００１            １１００
０００００１          １１０１
００００００１        １１１０
０００００００１      １１１１
ＴａｎａｋａおよびＬｅｏｎ−Ｇａｒｃｉａは、任意の２値メモリレス・ソースの場合には（１つのパラメータＰにより選択した場合  −  「１」ビットの確率）、その理論的な圧縮性に対して少なくとも９６％の効率でそのソースを圧縮するモード−ｍコードが存在することを示した。ｍの式は下記の通りである。
gamma=(squareroot(5)-1)/2
if(count(one_bits)=0)
p=1 / count(total_bits)
else
p=count(one_bits) / count(total_bits)
endif
m=ceiling( log2((ln
gamma) / ln(1-p)) )
それ故、この方法を使用してビットのブロックを圧縮するために、「１」ビットおよびビットの全数がカウントされ、最適のｍが計算され、ブロックがモードｍコードを使用して符号化される。コードｍのモードは符号化ブロックの始まりのところに格納することができる。詳細については、Ｈａｔｓｕｋａｚｕ  ＴａｎａｋａおよびＡｌｂｅｒｔ  Ｌｅｏｎ−Ｇａｒｃｉａの、「効率的なラン・レングス符号化」（Ｅｆｆｉｃｉｅｎｔ  Ｒｕｎ−Ｌｅｎｇｔｈ  Ｅｎｃｏｄｉｎｇｓ）情報理論についてのＩＥＥＥ議事録、２８（６）、１９８２年１１月、８８０〜８９０ページを参照されたい。
６．１３  ビットフィルタの算術符号化
算術符号化は、ビットフィルタを圧縮するための最もスペースを効率的に使用する方法であるが、ある実施形態の場合には、ラン・レングス符号化に関連して複雑さおよびおそらく速度の低下が起こる。２値算術コードについては、Ｌａｎｇｄｏｎ  Ｇ．ＧおよびＲｉｓｓａｎｅｎ  Ｊ．Ｊの参照文献内の、「算術符号化による白黒映像の圧縮」（Ｃｏｍｐｒｅｓｓｉｏｎ  ｏｆ  Ｂｌａｃｋ−Ｗｈｉｔｅ  Ｉｍａｇｅｓ  ｗｉｔｈ  Ａｒｉｔｈｍｅｔｉｃ  Ｃｏｄｉｎｇ）、通信に関するＩＥＥＥ議事録、２９（６）、１９８１年、８５８〜８６７ページで、ＬａｎｇｄｏｎおよびＲｉｓｓａｎｅｎが記述している。
６．１４  ビットフィルタの非線形圧縮
ビットフィルタ圧縮の興味のある面は、（所与の数の「１」ビットに対して）ビットフィルタのサイズを２倍にしても、圧縮したビットフィルタのサイズが２倍にならないことである。代わりに、そうすると少ない量だけサイズが増大する。何故なら、それは、２倍にしたビットフィルタの密度が元の密度の半分になり、エントロピーの低減が大きなビットフィルタをより圧縮しやすくするからである。
【００９１】
図１１は、１，０００の「１」ビットを含むビットフィルタのビットフィルタ密度と圧縮性との間の関係のグラフである。Ｘ軸は、（圧縮していない）ビットフィルタ内のビットの全数を表し、これが増大するにつれて、ビットフィルタのエントロピー（その圧縮したサイズの下の理論的境界）が増大するが、直線的には増大しない。ビットの５０％が「１」であり、５０％が「０」である２０００ビットの全サイズのところで、エントロピーは２０００ビットであるが、１０，０００ビットの全サイズのところでは、エントロピーは４８３４ビットであり、これは、一定数のビットに対して、ビットフィルタ・サイズと一緒にエントロピーが直線的に成長する場合には、予想（１０，０００ビット）の半分以下である。
【００９２】
この非直線性は、確率的に分析することができる。「１」ビットの確率がｐ（および、それ故、「０」ビットの確率が１−ｐ）である場合には、理論上、各「０」ビットは下記のように圧縮することができ、
-log2(1-p)ビット
各「１」ビットは下記のように圧縮することができる。
-log2(p)ビット
このことは、平均的に、ビットフィルタ内の各ビットは、下記のように圧縮することができることを意味し、
-(1-p)log2(1-p) - plog2(p)ビット
この式が図１１のグラフの形を決定することを意味する。
【００９３】
ビットフィルタの非直線圧縮性は、偽陽性率（ビットフィルタ密度に直接関連する）とメモリ消費との間のトレードオフが非直線的なものであり、任意の特定の実施形態の場合には、ある考えをトレードオフに入れなければならないことを意味する。特に、ビットフィルタの（圧縮していない）サイズを増大することはやってみたいことである。何故なら、そうすると、偽陽性率が直線的に低減するが、ビットフィルタが消費するスペースがほとんど直線的に（ｓｕｂ−ｌｉｎｅａｒｌｙ）増大するからである。
６．１５  ビットフィルタの分割
新しい各サブブロックが到着すると、ビットが「０」であるか「１」であるかを判定するために、（このサブブロックをビットフィルタ位置にハッシュすることにより）ビットフィルタ内でこのサブブロックがルックアップされる。全ビットフィルタを圧縮する場合には、各ルックアップの前に全ビットフィルタを圧縮解除しなければならないし（またはビットがアクセスされる前に、少なくともその一部を圧縮解除しなければならない）、時間がかかり、その出力（圧縮解除したビットフィルタ）は、圧縮したビットフィルタよりも数百倍大きくなる場合がある。
【００９４】
直ちに必要としないビットを圧縮解除するのを避けるために、ビットフィルタをセクションに分割することができ、各セクションを別々に圧縮することができる。個々のビットをルックアップするために、そのビットを含んでいるセクション（または試験するそのビットの前のセクションの一部）だけを圧縮解除すればよいし。各セクション用の別々のビットフィルタによりインデックスをセクションに分割する場合には、ビットフィルタは、さらなる再分割を必要としないほど小さいものであってもよい。別の方法としては、任意の一組のビットにアクセスする目的で、圧縮解除しなければならないビットフィルタの量を低減するためにビットフィルタをさらに再分割するのが有利である場合がある。
【００９５】
ビットフィルタを圧縮する場合には、サブブロックごとにＮ個のビットを設定する任意の技術は、約Ｎ個のセクションを圧縮解除しなければならない（ビットを設定する場合には、再度またビットを圧縮しなければならない）。この圧縮解除のために処理コストがかかるので、システム設計者はＮを小さく維持しようとする。
６．１６  欠落サブブロックの処理
図１７は、（多くの場合、欠落サブブロックのラン内で発生する）１つの欠落サブブロック１７０の、ビットフィルタ１７１およびインデックス・エントリ書込みバッファに関連する処理方法を示す。この図は、囲みＢＬＯＢ１７２の格納の一部として、格納中のサブブロックＥの処理の経過を示す。最初に、サブブロックＥは、ビットフィルタ内である位置を形成するためにハッシュされ１７３、その後でその位置の内容である２進数にハッシュされる。Ｅが記憶装置内に存在せず（およびこのセクションがこのケースに焦点を当てている場合には）、ビットは「０」である。何故なら、サブブロックが格納されようとしているし、サブブロックＥの存在を記録するために、ビットフィルタ内のビットが「１」に設定されるからである。次に、サブブロックは、記憶システム、およびサブブロックをその格納位置にマッピングする準備した１７５インデックス・エントリ内のある場所に格納される１７４。このインデックス・エントリ１７６は、後でディスク１７９上のサブブロック・インデックス１７８に書き込まれるインデックス・エントリ書込みバッファ１７７に追加される。この全プロセスのある態様は、（サブブロックＥ自身の内容もメモリ内にバッファされると仮定した場合）全プロセスは、１回のディスク・アクセスを必要としない。
６．１７  遠隔記憶システムの表示
分散記憶用途および通信用途の場合には、本発明の１つの態様を、例えば、サブブロックを遠隔コンピュータに送信する必要があるか否かを判定するために、遠隔コンピュータ上の一組のサブブロックの存在を表示するために使用することができる。一般に、本発明の１つの態様は、ビットフィルタを格納しているコンピュータ上だけではなく、世界のどこか他の場所の１つまたは複数のコンピュータ上の数組のサブブロックを表示するために使用することができる。図１９は、コンピュータＡ  １９０による、他のコンピュータＢ  １９４上に格納しているサブブロックの集合体に対応するビットフィルタ１９２の維持方法を示す。この例の場合には、コンピュータＡは、コンピュータＢがサブブロックＸ  １９６を処理しないと判定するためにそのビットフィルタを使用することができる。
【００９６】
１つのコンピュータ上の１つのビットフィルタは、複数の他のコンピュータ上の数組のサブブロックの合同を表示することができる。
６．１８  ロバスト性
本発明の典型的な実施形態の場合には、インデックスはディスク上に常駐していて、ビットフィルタおよびインデックス・エントリ書込みバッファはメモリ内に常駐している（図１２）。典型的な場合には、ビットフィルタのコピーは、時々更新されるディスク上に維持される。システムがクラッシュした場合、この編成はどのように対応するか？
コンピュータがクラッシュし、メモリの内容が失われた場合には、ビットフィルタ内の種々のビットの設定も失われる（何故なら、ディスク上のビットフィルタの古いコピーは、これらの位置のあるもの内に「１」よりも「０」を有しているからである）。インデックス・エントリ書込みバッファ内のインデックス・エントリも失われる。
【００９７】
これらの各喪失は、冗長性低減性能に悪影響を与える場合があるが、正確さは悪影響を受けない。ビットフィルタ内のいくつかのビットの設定の喪失の影響、またはインデックス・エントリの喪失の影響は、サブブロックは依然として記憶装置内に安全に存在し（および１つまたは複数のＢＬＯＢの一部を依然として形成しているが）、記憶装置のインデックスは、もはやサブブロックを記憶していない。それ故、同じサブブロックが再度到着した場合には、もう一度格納されることになる。このことは正確さに悪影響を与えない。何故なら、最初のサブブロックは依然としてサブブロック・プール内に存在し、インデックスから独立してサブブロックをポイントしている１つまたは複数のＢＬＯＢの一部として依然としてアクセスすることができるからである。
【００９８】
それ故、ビットフィルタのビットが「１」から「０」へ変化した場合の影響は、１つまたは複数のサブブロックが、格納中の新しいＢＬＯＢの一部として表れた場合、このような１つまたは複数のサブブロックは記憶装置内で複製される。ビットフィルタのビットが「０」から「１」へ変化すると、新しいサブブロックがたまたまビットフィルタ内のそのビットにハッシュした場合はいつでも、インデックスがアクセスされる。
【００９９】
それ故、ビットフィルタ内の「１」ビットの結果としての喪失は、正確さに悪影響を与えないし、クラッシュが比較的希な場合には、バッファ内またはバッファ内のインデックス・エントリ内のいくつかの「１」ビットの喪失は、低減性能に大きな影響を与えない。
【０１００】
低減性能が非常に絶対的に重要な場合、またはサブブロック・プールは決して同じサブブロックを２回格納してはならないというある絶対的要件がある場合には、この実施形態は、システムがクラッシュしてもその内容が失われないある種の不揮発性ＲＡＭを使用することできる。
【０１０１】
図２２は、典型的なコンピュータ・ハードウェア上でのある実施形態の展開方法を示す。サブブロック・インデックス・デジタル探索木は、メモリおよびディスク上に常駐しているが、サブブロック・インデックス・ハッシュ・テーブルはディスク上にしか常駐していない。ビットフィルタは、メモリ内に常駐していて、一方、インデックス・エントリは、ディスク上のハッシュ・テーブルに書き込まれるキャッシュ・エントリをバッファする。
６．１９  範囲に関する注
当業者であれば、本発明は、上記の特定の用途に限定されないことを理解することができるだろう。また、本発明は、本明細書に記載し図面に示した特定の要素および／または機能に関してその好ましい実施形態に限定されない。本発明の原理から逸脱することなしに、種々の修正を行うことができることを理解することができるだろう。それ故、本発明は、本発明の範囲内に入るすべてのこのような修正を含むものと解釈すべきである。
【図面の簡単な説明】
【０１０２】
【図１】サブブロック・プールおよびプール内の任意のサブブロックの位置を発見することができるインデックス（Ｗｉｌｌｉａｍｓの米国特許第５，９９０，１８０号からの従来技術）である。
【図２】同一のサブブロックを１回だけ格納することにより、狭いスペース内にファイルを格納することができるようにする２つの異なるファイル内の同一のサブブロックの識別方法である。
【図３】格納する次のサブブロックが記憶装置内にすでに存在すると判定した場合に、格納する次のサブブロックと今一致したサブブロックの後の記憶装置内のサブブロックとを、サブブロック・インデックスを参照しなくても比較することができる方法である。
【図４】データのＢＬＯＢ内のサブブロックを、一致する（存在）および一致しない（欠落）サブブロックの交互のランからなるものとして表示することができる方法である。
【図５】ビットフィルタ・インデックスを生成するために、最初にその暗号ハッシュを取り、次にそれをビットフィルタ・ハッシュ関数内に送ることにより、サブブロックをビットフィルタ内のある位置にマッピングする方法である。
【図６】２つのサブブロックがビットフィルタ内の同じ位置にハッシュするビットフィルタ衝突である。
【図７】サブブロック・インデックスを、ビットフィルタおよびメモリ内に常駐するインデックス・エントリ書込みバッファだけと一緒にディスク上に常駐させる方法である。
【図８】その各葉が、ディスク上に格納しているハッシュ・テーブルと、メモリ内に格納しているインデックス・エントリ書込みバッファを含むデジタル二分探索木である。
【図９】ＢＬＯＢを格納する場合、孤立している一致するサブブロック（Ｃ）が、ＢＬＯＢの表示内でどのようにフラグメンテーションを起こすのかを示す。
【図１０】２回記憶装置内に孤立サブブロック（Ｃ）を格納することを選択することによりフラグメンテーションを回避する方法を示す。
【図１１】ビットフィルタの密度とその圧縮性との間の非線形関係を示す。このグラフは、１，０００の「１」ビットを含むビットフィルタの圧縮性を示す。Ｘ軸は、ビットフィルタの圧縮していない全サイズ、Ｙ軸は、ビットフィルタの最適に圧縮したサイズを示す。
【図１２】インデックス・エントリ書込みバッファの使用方法を示す。この場合、ビットフィルタおよびバッファは、メモリ内に保持され、サブブロック・インデックス自身はディスク上に常駐する。
【図１３】記憶システム内の一組のサブブロックから入手したビットフィルタである。
【図１４】ビットフィルタ・インデックスを生成するために、最初にそのハッシュを取り、次にそれをビットフィルタ・ハッシュ関数に送ることにより、ビットフィルタ内のある位置にサブブロックをマッピングする方法を示す。
【図１５】そのそれぞれの葉がディスク上に格納しているハッシュ・テーブル、およびメモリ内に格納しているビットフィルタおよびインデックス・エントリ書込みバッファを含む、サブブロック・ハッシュの連続しているビット上にキーされているデジタル二分探索木である。
【図１６】サブブロックのシーケンス内で、サブブロックのシーケンスに対するＴ個の存在サブブロックの隣接するランが存在しないと判定するプロセスを示す。
【図１７】分割方法によるＢＬＯＢのサブブロックへの分割、ビットフィルタ内でのサブブロックＥのハッシュ、そのビットの試験、ビット値が「０」である場合だけのビットの「１」への設定、およびインデックス・エントリ・バッファへのＥに対するエントリの追加を示す。
【図１８】ＢＬＯＢ１を格納したが、各３番目のサブブロックだけを索引した場合を示す。ＢＬＯＢ２を追加した場合には、その各サブブロックがインデックス内でルックアップされ、一致が発見された場合には、一致するブロックレット（ｂｌｏｃｋｌｅｔ）に対する探索が、後方および前方に行われる。
【図１９】コンピュータＡによる、他のコンピュータＢ上に格納しているサブブロックの集合体に対応するビットフィルタの維持方法を示す。この例の場合には、コンピュータＡは、コンピュータＢがサブブロックＸを含んでいないと判定するためにそのビットフィルタを使用することができる。
【図２０】ビット・フィルタ内のある位置にサブブロックをマッピングする複数のＮ個の異なる関数の、各サブブロックに対するビット・フィルタ内でＮ個のビットを設定するための使用方法を示す。
【図２１】各サブブロックがＮ個のビットを設定した場合（図２０に示す）のビット・フィルタによるサブブロックの試験方法を示す。サブブロックは、Ｎ個の各関数によりハッシュされ、結果はビット・フィルタを索引するために使用される。結果として得られるビットは、ルックアップ結果を形成するために論理積がとられる。
【図２２】典型的なコンピュータのハードウェア上でのある実施形態の展開方法を示す。サブブロック・インデックス・デジタル探索木は、メモリおよびディスク内に常駐しているが、サブブロック・インデックス・ハッシュ・テーブルはディスク上だけに常駐している。ビットフィルタは、メモリ内に常駐していて、インデックス・エントリは、ディスク上のハッシュ・テーブルに書き込まれるキャッシュ・エントリをバッファする。
【図１】
2008533571.tif 000003
【図２】
2008533571.tif 000004
【図３】
2008533571.tif 000005
【図４】
2008533571.tif 000006
【図５】
2008533571.tif 000007
【図６】
2008533571.tif 000008
【図７】
2008533571.tif 000009
【図８】
2008533571.tif 000010
【図９】
2008533571.tif 000011
【図１０】
2008533571.tif 000012
【図１１】
2008533571.tif 000013
【図１２】
2008533571.tif 000014
【図１３】
2008533571.tif 000015
【図１４】
2008533571.tif 000016
【図１５】
2008533571.tif 000017
【図１６】
2008533571.tif 000018
【図１７】
2008533571.tif 000019
【図１８】
2008533571.tif 000020
【図１９】
2008533571.tif 000021
【図２０】
2008533571.tif 000022
【図２１】
2008533571.tif 000023
【図２２】
2008533571.tif 000024
【国際調査報告】
2008533571.tif 000025
2008533571.tif 000026