論文翻訳: Cuckoo Filter: Practically Better Than Bloom
Bin Fan, David G. Andersen, Michael Kaminsky†, Michael D. Mitzenmacher‡
Carnegie Mellon University, †Intel Labs, ‡Harvard University
{binfan,dga}@cs.cmu.edu, michael.e.kaminsky@intel.com, michaelm@eecs.harvard.edu
概要
多くのネットワーキングシステムにおいて Bloom フィルターは高速な集合メンバーシップテストに使用されている。これは非常に優れた空間効率でごく一部の偽陽性 (false positive) 応答を許容する。しかし Bloom フィルターは集合から要素を削除することができず、"標準的な" Bloom フィルターを拡張して削除をサポートしようとするこれまでの試みはいずれも空間または性能のいずれかを低下させるものであった。
我々は近似集合メンバーシップテストのための Bloom フィルターを置き換えることのできる Cuckoo フィルターと呼ばれる新しいデータ構造を提案する。Cuckoo フィルターは要素の動的な追加と削除をサポートし Bloom フィルターよりもさらに高い性能を達成する。多くの要素を保存し適度に低い偽陽性を目標とするアプリケーションでは、Cuckoo フィルターは空間最適化された Bloom フィルターよりも空間オーバーヘッドが低い。我々の実験結果では、Cuckoo フィルターは Bloom フィルターに削除をサポートするように拡張した従来のデータ構造より時間と空間の両方で大幅に優れていることを示している。
Table of Contents
- 概要
- 1. 導入
- 2. 背景と関連研究
- 3 Cuckoo フィルターアルゴリズム
- 4. 漸近的な挙動
- 5. 空間の最適化
- 6. Bloom フィルターとの比較
- 7. 評価
- 8. 結論
- 9. ACKNOWLEDGEMENTS
- 10. REFERENCES
- 翻訳抄
Categories and Subject Descriptors
E.1 [Data]: Data Structures; E.4 [Data]: Data Compaction and Compression
Keywords
Cuckoo hashing; Bloom filters; compression
1. 導入
多くのデータベース、キャッシュ、ルータ、ストレージシステムは近似集合メンバーシップ (approximate set membership) テストを使用して特定の要素が (通常は大きな) 集合に含まれるかどうかを、小さな偽陽性 (false positive) の確率をもって判断する。このテストで最も広く使われているデータ構造は Bloom フィルター [3] であり、そのメモリ効率の高さから広く研究されている。Bloom フィルターは、確率的ルーティングテーブルに必要な空間削減 [25]、IP アドレスの最長接頭辞マッチングの高速化 [9]、ネットワーク状態の管理と監視の改善 [24, 4]、パケット内のマルチキャスト転送情報のエンコード [15] など、多くのアプリケーションに使用されている [6]。
標準的な Bloom フィルターの制限はフィルター全体を再構築しないと既存の要素を削除できないことである (さもなくば一般にあまり好ましくない偽陰性をもたらす可能性がある)。いくつかのアプローチでは標準の Bloom フィルターを拡張して削除をサポートしているが空間や性能に大きなオーバーヘッドを伴う。カウンティング Bloom フィルター (Counting Bloom Filter) [12] は複数のアプリケーション [24, 25, 9] で提案されているが、通常、空間最適化された Bloom フィルターと同じ偽陽性率を維持するために 3-4 倍の空間を使用する。他の変種として
この論文では、近似集合メンバーシップテストで削除をサポートしても標準の Bloom フィルターと比較して空間や性能に高いオーバーヘッドを課す必要がないことを示している。我々は 4 つの主要な利点を提供する実用的なデータ構造である Cuckoo フィルターを提案する。
要素の動的な追加と削除をサポートする;
従来の Bloom フィルターに比べて、満杯に近い場合 (例えば 95% の空間使用率) でも高い検索性能を提供する;
Quotient フィルターのような代替手法よりも実装が簡単である;
目標の偽陽性率が 3% 未満であれば、多くの実用的なアプリケーションにおいて Bloom フィルターよりも使用する空間が少ない。
Cuckoo フィルターは Cuckoo ハッシュテーブル [21] のコンパクトな変形で、Key-Value ペアの代わりに、挿入された各要素のフィンガープリント (ハッシュ関数を使用して要素から導出されたビット列) のみを格納する。フィルターはフィンガープリントで密に埋められており (例えば 95% のエントリが占有されている) 高い空間効率が得られる。要素
Cuckoo フィルターを構築する場合、そのフィンガープリントのサイズは目標とする偽陽性率
Cuckoo フィルターはフィンガープリントのみがフィルターに格納されており、各要素の元となるキーと値のビットはもはや検索できないことから通常のハッシュテーブルとは大きく異なる。完全なキーが保存されないため、Cuckoo フィルターはハッシュ値に基づいて既存のキーを移動することも、新しい要素を挿入するための標準的な Cuckoo ハッシュを実行することもできない。この違いは Cuckoo ハッシュに適用される標準的な手法、分析、最適化が必ずしも Cuckoo フィルターに引き継がれるわけではないことを意味している。
この論文による技術的貢献は以下の通りである。
標準的な Cuckoo ハッシングの変種である部分キー Cuckoo ハッシングを適用して要素の動的な追加と削除をサポートする Cuckoo フィルターを構築する (セクション 3)。
部分キー Cuckoo ハッシングが現実世界のほとんどのアプリケーションで高いテーブル占有率を保証する理由を探る (セクション 4)。
空間効率において Bloom フィルターを上回る Cuckoo フィルターの最適化 (セクション 5)。
2. 背景と関連研究
2.1 Bloom フィルターとその変種
Table 1 にまとめたように、標準の Bloom フィルターと削除のサポートや検索性能の向上を含む変種を比較する。これらのデータ構造はセクション 7 で経験的に評価される。Cuckoo フィルターはこれらのデータ構造より高い空間効率と性能を達成している。
標準的な Bloom フィルター [3] は Insert と Lookup の 2 つの操作をサポートする要素集合のコンパクトな表現を提供する。Boom フィルターはクエリが "間違いなく存在しない" (definitely not) (誤りなし) か "おそらく存在する" (probably yes) (誤りの可能性
Bloom フィルターは
Bloom フィルターは空間効率が非常に優れているが最適とは言えない [20]。偽陽性の場合、空間最適化された Bloom フィルターは
情報理論上の最適値は、フィンガープリント (長さ
カウンティング Bloom フィルター [12] は削除を許容するように Bloom フィルターを拡張したものである。カウンティング Bloom フィルターはビット配列の代わりにカウンターの配列を使用する。挿入操作は
Blocked Bloom フィルター [22] は削除をサポートしないが検索でより優れた空間的局所性を提供する。Blocked Bloom フィルターは小さな Bloom フィルターの配列で構成され、それぞれの Bloom フィルターは CPU キャッシュラインに収まる。各要素はハッシュパーティショニングによって決定されたこれらの小さな Bloom フィルターのうちの 1 つだけに格納される。その結果、どのクエリーでもその Bloom フィルターをロードするキャッシュミスは最大でも 1 回となり性能が大幅に向上する。欠点は、小さな Bloom フィルターの配列全体で負荷が不均衡になるため偽陽性率が高くなることである。
Quotient フィルター [2] もまた削除をサポートするためにフィンガープリントを格納するコンパクトなハッシュテーブルである。Quotient フィルターはより優れた空間的局所性を提供するために線形プローブと同様の技術を使用してフィンガープリントを特定する。ただし各エントリをエンコードするために追加のメタデータを必要とし、同様の標準 Bloom フィルターよりも 10~25% 多くの空間を必要とする。さらにそのすべての操作はターゲットの要素に到達する前にテーブルエントリのシーケンスをデコードする必要があり、ハッシュテーブルを埋めれば埋めるほどこれらのシーケンスは長くなる。その結果ハッシュテーブルの使用率が 75% を超えるとその性能は著しく低下する。
その他の変種: Bloom フィルターを空間および/または性能の面で改善するために他の変種が提案されている。Rank-Index ハッシング [14] は圧縮されたフィンガープリントを保存するために線形チェーン法ハッシュテーブルを構築する。
2.2 Cuckoo ハッシュテーブル
Cuckoo ハッシングの基本: 基本的な Cuckoo ハッシュテーブル [12] はバケットの配列で構成され、各要素はハッシュ関数
Cuckoo ハッシングは新しい要素を挿入する際に以前の要素の配置決定を改善するため高い空間占有率を保証する。Cuckoo ハッシングのほとんどの実用的な実装は、[10] で提案されているように、複数の要素を保持するバケットを使用することで上記の基本的な説明を拡張している。すべてのハッシュ関数が完全にランダムであると仮定して、
Cuckoo ハッシュを集合メンバーシップに使用: 最近、いくつかのアプリケーションでは集合メンバーシップ情報を提供するために標準的な Cuckoo ハッシュテーブルが使用されている。トランザクショナルメモリをサポートするために Sanchez らは各トランザクションのメモリアドレスの読み書きの集合を Cuckoo ハッシュテーブルに格納し、このテーブルが一杯になったら Bloom フィルターに変換することを提案した [23]。彼らの設計では標準的な Cuckoo ハッシュテーブルを使用していたため Cuckoo フィルターよりもはるかに多くの空間を必要としていた。高速でメモリ効率の良い Key-Value ストア [17, 11] とソフトウェアベースのイーサネットスイッチ [26] の構築に関する我々の以前の研究ではすべての内部データ構造として Cuckoo ハッシュテーブルを適用していた。この研究は部分キー Cuckoo ハッシング (partial-key cuckoo hashing) と呼ばれる最適化によってハッシュテーブルの性能を向上させることに動機づけられ、またそれに焦点を当てたものだった。しかしこの論文で示すように、この技術はこれまで研究されていなかった Bloom フィルターに代わる新しいアプローチを構築することを可能とした。結果としてこの論文では部分キー Cuckoo ハッシングも適用するが、より重要なのは (Key-Value クエリーではなく) 集合メンバーシップテストを提供するために特にこの技術を採用することの詳細な分析を提供し、さらに代替の集合メンバーシップデータ構造と Cuckoo フィルターの性能を比較する。
Cuckoo フィルターの課題: Cuckoo フィルターの空間効率を高めるために、我々は高速検索と高いテーブル占有率 (例えばハッシュテーブルのスロットが 95% 埋まっているような) を提供する多方向連想 Cuckoo ハッシュテーブル (multi-way associative cuckoo hash table) を使用する。ハッシュテーブルのサイズをさらに縮小するために各要素はまず一定サイズのフィンガープリントにハッシュされてからこのハッシュテーブルに挿入される。このデータ構造を適用する課題は挿入プロセスを再設計し要素ごとに空間使用量を最小限に抑えるためにハッシュテーブルを慎重に構成することである:
第一に、ハッシュテーブルにフィンガープリントのみを保存すると標準的な Cuckoo ハッシュのアプローチを使用して要素を挿入できなくなる。なぜなら Cuckoo ハッシングでの挿入アルゴリズムは既存のフィンガープリントを代替の位置に再配置できなければならないためである。空間効率は悪いが簡単な解決策は、挿入された各要素を全体として (おそらくテーブルの外部に) 保存することである。元の要素 ("キー") があればその代替の場所を計算するのは簡単である。対照的に Cuckoo フィルターは部分キー Cuckoo ハッシングを使いフィンガープリントのみに基づいてアイテムの代替の位置を見つける (セクション 3)。
第二に、Cuckoo フィルターは各要素をハッシュテーブル内の複数の可能な場所に関連付ける。要素を格納する場所におけるこの柔軟性はテーブルの占有率を向上させるが、各検索でより多くの可能性のある場所を調査するときに同じ偽陽性率を維持するには、より長いフィンガープリントのためにより多くの空間を必要とする。セクション 5 では要素あたりの平均空間コストを最小化するためにテーブルの占有率とそのサイズのバランスを最適化する我々の分析を紹介する。
3 Cuckoo フィルターアルゴリズム
この論文では Cuckoo フィルターに使用される Cuckoo ハッシュテーブルの基本単位をエントリと呼ぶ。各エントリには 1 つのフィンガープリントが保存される。ハッシュテーブルはバケットの配列で構成され、バケットには複数のエントリを含めることができる。
このセクションでは Cuckoo フィルターがどのように Insert, Lookup, Delete 操作を行うかを説明する。セクション 3.1 では Cuckoo フィルターが動的に新しい要素を挿入できるようにする標準的な Cuckoo ハッシングの変種である部分キー Cuckoo ハッシュについて説明する。この手法は以前の研究 [11] で初めて紹介されたが、そこでは完全なキーが格納されている通常の Cuckoo ハッシュテーブルの検索および挿入の性能を向上させることが目的であった。この論文では対照的にフィンガープリントのみで部分キー Cuckoo ハッシュを使用する際の空間効率の最適化と分析に焦点を当て、Cuckoo フィルターを Bloom フィルターと同等またはそれよりもさらにコンパクトなものにする。
3.1 Insert
前述の通り、標準的な Cuckoo ハッシングで既存のハッシュテーブルに新しい要素を挿入するには、新しい要素のための空間を確保するために必要に応じてそれらをどこに再配置するかを決定するために、元の既存の要素にアクセスする何らかの手段が必要である (セクション 2.2)。しかし Cuckoo フィルターはフィンガープリントのみを保存するため元のキーを復元して再ハッシュしその代替の位置を見つける方法がない。この制約を克服するために部分キー Cuckoo ハッシングと呼ばれる技術を利用してフィンガープリントに基づいて要素の代替の位置を導出する。要素
式 (
さらにフィンガープリントはテーブル内で要素を均一に分散できるように現在のバケットのインデックスと XOR 演算される前にハッシュ化される。もし代替の場所がフィンガープリントをハッシュせずに "
部分キー Cuckoo ハッシングを使い、Cockoo フィルターはアルゴリズム 1 に示すプロセスによって新しい要素を動的に追加する。これらのフィンガープリントは
第二に、同じフィンガープリントを持つ 2 つの異なる要素
3.2 Lookup
Cuckoo フィルターの検索処理はアルゴリズム 2 に示すように単純である。要素
3.3 Delete
標準的な Bloom フィルターは削除ができないため 1 つの要素を削除するためにフィルター全体を再構築する必要がある一方で、カウンティング Bloom フィルターはかなりの空間を必要とする。Cuckoo フィルターはカウンティング Bloom フィルターと似ていて、削除時にハッシュテーブルから対応するフィンガープリントを削除することで挿入されている要素を削除することができる。同様の削除プロセスを持つ他のフィルターは Cuckoo フィルターよりも複雑であることが分かる。例えば
アルゴリズム 3 で示されている Cuckoo フィルターの削除プロセスははるかに簡単である。特定の要素について両方の候補バケットをチェックし、どちらかのバケット内でフィンガープリントが一致すると、その一致したフィンガープリントのコピーがそのバケットから削除される。
削除では要素を削除した後にエントリーをクリーンアップする必要はない。また 2 つの要素が 1 つの候補バケットを共有し同じフィンガープリントを持つ場合の "偽削除" 問題も回避できる。例えば要素
要素
- 1
-left カウンティング Bloom フィルターの単純な実装には "偽削除" 問題がある。 -left カウティング Bloom フィルターは各要素をテーブルのパーティションからの 個の候補バケットにマッピングし、その 個のバケットを一つにフィンガープリントを保存する。2 つの異なる要素が 1 つのバケットのみを共有し、それらが同じフィンガープリントを持つ場合 (フィンガープリントが小さい場合に起きやすい)、この特定のバケットからフィンガープリントを直接削除すると間違った要素が削除される可能性がある。この問題に対処するために -left カウンティング Bloom フィルターは各テーブルエントリに追加のカウンターと追加の間接関数 (indirection) を使用する [5]。 - 2Quotient フィルターでは同じ商 (quotient) (すなはち
個の最上位ビット) を持つすべてのフィンガープリントはその数値の順序に従って連続したエントリに格納されなければならない。従ってフィンガープリントのクラスタから 1 つのフィンガープリントを削除するには、穴の後のすべてのフィンガープリントを 1 スロット分シフトさせ、またそれらのメタデータのビットも変更する必要がある [2]。
4. 漸近的な挙動
ここで我々は部分キー Cuckoo ハッシュを使用して Cuckoo フィルターにフィンガープリントを保存すると、フィルターサイズに応じてゆっくりと増加するフィンガープリントサイズの下限が得られることを示す。これはフィンガープリントのサイズが望ましい偽陽性率のみに依存する他のアプローチ (以前に取り上げた静的 Bloom フィルターのフィンガープリントや完全ハッシュなど) とは対照的である。これは否定的に見えるかもしれないが、実際にはその影響は重要ではないように思われる。経験的に、各バケットが 6 ビット以上の 4 つのフィンガープリントを保持している場合、最大 40 億の要素を含むフィルターはハッシュテーブルを 95% の負荷で効率的に埋めることができる。
このセクションと次のセクションでの分析に使用される表記は以下の通り:
| |
目標の偽陽性率 |
| |
フィンガープリントのビット長 |
| |
負荷係数 ( |
| |
バケットあたりのエントリ数 |
| |
バケット数 |
| |
要素数 |
| |
要素ごとの平均ビット数 |
最小フィンガープリントサイズ: 我々の提案する部分キー Cuckoo ハッシングは与えられた要素の現在の位置とフィンガープリントに基づいて候補バケットを導出する (セクション 3)。その結果として各要素の候補バケットは独立ではない。例えば要素がバケット
直感的には、フィンガープリントが十分に長ければ部分キー Cuckoo ハッシングは標準の Cuckoo ハッシングに十分近似できる可能性がある。しかしハッシュテーブルが非常に大きく、比較的短いフィンガープリントを格納する場合、ハッシュの衝突により挿入が失敗する可能性が高まり、テーブルの占有率が減少する可能性がある。このような状況は、Cuckoo フィルターが多数の要素をターゲットにしているものの偽陽性率が適度に低い場合に発生することがある。以下では挿入失敗の確率の下限を解析的に求める。
まず与えられた
ここで定数
我々は重大な失敗確率を回避するには
Bloom フィルターは要素ごとに定数 (約
経験的評価: Figure 2 はフィンガープリントサイズ
Figure 2 に示すように、さまざまな構成において十分に長いフィンガープリントでは
洞察: 式 (
セクション 7 で説明するようにヒューリスティックな部分キー Cuckoo ハッシングは非常に効率的である。しかしながら、新しい要素を挿入するコストの限界の証明や、ハッシュ関数にどれだけの独立性が要求されるかの研究など、この手法に関するいくつかの理論的な問題は将来の研究のために未解決のままである。
- 3ここではフィンガープリントのハッシュ (つまり
) に衝突がないと仮定する。実際には は数ビットであり はもっと長いからである。
5. 空間の最適化
セクション 3 で示した Cuckoo フィルター操作の Insert, Lookup, Delete の基本アルゴリズムはハッシュテーブルの構成 (例えば各バケットがいくつのエントリーを持つかなど) とは独立している。ただし Cuckoo フィルターのパラメータを適切に選択することは空間効率に大きな影響を与える可能性がある。このセクションではパラメータの選択と追加のメカニズムを通じて Cuckoo フィルターの空間効率を最適化することに焦点を当てる。
空間効率は満杯状態のフィルターの各要素を表す平均ビット数によって測定され、テーブルサイズをフィルターが効率的に格納できる要素の総数で割ることで導出される。ハッシュテーブルの各エントリーには 1 つのフィンガープリントが格納されるが、すべてのエントリーが占有されているわけではないのは前述の通り。その結果、各要素の保存コストは実質的にフィンガープリントよりも高くなる。各フィンガープリントが
5.1 最適バケットサイズ
Cuckoo フィルターの総サイズを一定に保ちながらバケットサイズを変更すると次の 2 つの結果が得られる:
バケットを大きくするとテーブルの占有率が向上する (つまり
を大きくする が大きくなる)。 のハッシュ関数ではバケットサイズ (つまりハッシュテーブルが直接マッピングされる) ときの負荷率 は 50% だが、バケットサイズ を使用するとそれぞれ 84%, 95%, 98% に増加する。より大きなバケットは同じ偽陽性率を維持するためにより長いフィンガープリントを必要とする (つまり
を大きくする が大きくなる。より大きなバケットでは、各検索でより多くのエントリーがチェックされるためフィンガープリントの衝突が発生する可能性が高くなる。存在しない要素を検索する最悪ケースでは、クエリーはバケットごとに 個のエントリーを持ち得る 2 つのバケットを探す必要がある。(これらのバケットがすべて埋まっているとは限らないが、ここではバケットが埋まっている最悪ケースを分析する。これにより 95% が満たされているテーブルについてかなり正確な推定値が得られる。) 各エントリーにおいて、クエリーが 1 つの保存されたフィンガープリントとマッチし偽陽性のマッチに成功する確率は最大でも である。このような比較を 回行った後、偽フィンガープリントがヒットする確率の合計の上限は となり、これはバケットサイズ に比例する。目標とする偽陽性率 を維持するためにフィルターは を保証し、したがって必要とされる最小フィンガープリントのサイズはおよそ: となる。
空間コストの上限: 既に示したように
最適バケットサイズ
要約すると、我々は
5.2 空間節約のための半ソートバケット
このサブセクションでは、バケットごとに
以下の例は圧縮がどのように空間を節約するかを示している。各バケットが
この順列ベースのエンコード (つまり考え得るすべての結果のインデックス付け) では各検索で追加のエンコード/デコードテーブルの間接参照が必要になることに注意。したがって高い検索性能を達成するにはエンコード/デコードテーブルをキャッシュに納まる程度に小さくすることが重要である。結果として我々の "半ソート" 最適化はこの手法を 4 つのエントリーのバケットを持つテーブルのにも適用する。またフィンガープリントが 4 ビットより大きい場合、各フィンガープリントの最上位 4 ビットのみがエンコードされ残りは直接個別に保存される。
- 4Cuckoo フィルターが削除をサポートする必要がない場合、フィンガープリントリストの重複エントリを無視することができ、エントリごとに追加のビットの一部を節約できる可能性が生じる。
6. Bloom フィルターとの比較
Table 2 に示す指標といくつかの追加要素を用いて Bloom フィルターと Cuckoo フィルターを比較する。
空間効率性: Table 2 は空間最適化された Bloom フィルターと Cuckoo フィルターを半ソートありとなしで比較している。Figure 4 は
メモリアクセス数:
値の関連付け: Cuckoo フィルターはマッチした各フィンガープリントに対して (フィルターの外部に保存されている) 関連する値を返すように拡張することもできる。Cuckoo フィルターのこの特性は近似テーブル検索メカニズムを提供し、これは (偽陽性のヒットにより複数のフィンガープリントとマッチする可能性があるため) 既存の要素については平均して
最大容量: Cuckoo フィルターには負荷しきい値がある。実現可能な最大負荷率に達すると挿入は自明ではなくなり、失敗する可能性が高くなるためより多くの要素を格納するためにハッシュテーブルを拡張しなければならない。対照的に Bloom フィルターには新しい要素を挿入し続けることができるが、同じ目標偽陽性率を維持するためには Bloom フィルターでも拡張する必要がある。
重複の制限: Cuckoo フィルターが削除をサポートする場合、同じ要素の複数のコピーを保存する必要がある。同じ項目を
7. 評価
我々の実装5は標準的な Cuckoo フィルターのための約 500 行の C++ コードとセクション 5.2 で説明されている "半ソート" 最適化のサポートのための約 500 行のコードで構成されている。以下では基本的な Cuckoo フィルターを "CF"、半ソート機能を持つ Cuckoo フィルターを "ss-CF" と表記する。Cockoo フィルターに加えて比較のために他の 4 つのフィルターを実装した:
標準 Bloom フィルター (BF) [3]: 我々は標準 Bloom フィルターをベースラインとして評価した。すべての実験においてハッシュ関数の数
はフィルターサイズと要素の総数に基づいて最小の偽陽性率を達成するように構成されている。さらにより少ないハッシュ処理で検索と挿入を高速化するパフォーマンス最適化が適用されている [16]。各挿入または検索には 2 つのハッシュ関数 と のみが必要で、これら 2 つの関数を使用して追加の 個のハッシュ関数を の形式でシミュレートする。Blocked Bloom フィルター (blk-BF) [22]: 各フィルターはブロックの配列で構成され、各ブロックは小さな Bloom フィルターである。各ブロックのサイズはテストベッドの CPU キャッシュラインと一致する 64 バイトである。小さな Bloom フィルターごとに標準的な Bloom フィルターと同様に複数のハッシュ関数をシミュレートする最適化も適用している。
Quotient フィルター (QF) [2]: 我々は Quotient フィルターの独自実装を評価した6。このフィルターは、要素ごとに 3 ビットを検索に有用な追加のメタデータとして保存する。Quotient フィルターのパフォーマンスは負荷が大きくなるにつれて低下するため [2] で評価したように最大負荷係数を 90% に設定する。
-left カウンティング Bloom フィルター (dl-CBF) [5]:このフィルターは のハッシュテーブルを持つように構成されている。すべてのハッシュテーブルは同じ数のバケットを持ち、各バケットは 4 つのエントリーを持つ。
標準 Bloom フィルターと Blocked Bloom フィルターは削除をサポートしていないため、ベースラインとして比較されることを強調しておく。
実験のセットアップ: 挿入する要素はすべて事前に乱数生成器で生成された 64 ビット整数である。重複する可能性は非常に低いため重複要素は削除しなかった。
各クエリーでは、すべてのフィルターが最初に CityHash [1] を使用して要素の 64 ビットハッシュを生成する。次に各フィルターはハッシュの 64 ビットを必要に応じて分割する。例えば Bloom フィルターは上位 32 ビットと下位 32 ビットをそれぞれ最初の 2 つの独立したハッシュとして扱い、これら 2 つの 32 ビット値を使って他の
メトリクス: さまざまなフィルターが機能、空間、性能のトレードオフをどのように実現するかを完全に理解するために以下の指標によって上記のフィルターを比較する:
空間効率性: ビット単位のフィルターサイズを満杯のフィルターに含まれる要素数で割った値で測定する。
達成偽陽性率: 存在しない項目でフィルターにクエリーを行いポジティブの返値の割合をカウントすることで測定する。
構築率: 満杯のフィルターに含まれる要素数を、この満杯のフィルターを空から構築する時間で割った値で測定する。
検索、挿入、削除スループット: フィルターが 1 病患に実行できる操作の平均数で測定する。この値はワークロードとフィルターの占有率によって異なる。
7.1 達成偽陽性率
まず空間効率と偽陽性率を評価する。各実行ではすべてのフィルターが同じサイズ (192MB) になるように構成されている。Bloom フィルターは 9 個のハッシュ関数を使用するように設定され、1 要素あたり 13 ビットで偽陽性を最小化する。Cuckoo フィルターの場合、ハッシュテーブルには
各フィルターは初期状態で空であり、フィルターで挿入エラー (CF および dl-CBF) が検出されるか、目標容量制限 (BF, blk-BF, QF) に達するまで要素が配置される。さまざまなフィルターの構築率と偽陽性率を Table 3 に示す。
すべてのフィルターの中で ss-CF は最も低い偽陽性率を達成している。ほぼ同じ量の空間 (12.60 bit/item) を使用して半ソートを有効にすることで各要素のフィンガープリントに 1 ビット多くエンコードできるため、偽陽性率は 0.19% から 0.09% に半減する。一方、半ソートでは各バケットにアクセスする際にエンコードとでコードを必要とするため構築率が 1 秒あたり 500 万件から 313 万件に低下する。
BF と blk-BF はともに
QF は BF や CF に比べて要素ごとに多くのビットを消費し、2 番目に優れた偽陽性率を達成している。各バケットのエンコードとデコードにコストがかかるため QF の構築率は最も低い。
最後に、dl-CBF はテーブル全体が約 78% 埋まると挿入の失敗を認識し構築を停止するため保存される項目はさらに少なくなる。各検索で 16 個のエントリをチェックする必要があるためハッシュ衝突の可能性が高くなり、達成される偽陽性率は他のフィルターよりはるかに悪くなる。
7.2 検索パフォーマンス
様々なワークロード: 次に、フィルターが満たされた後の検索性能のベンチマークを行う。このセクションでは様々なワークロードでの検索のスループットと遅延を比較する。ワークロードは検索速度に影響を与える可能性があるポジティブクエリー (つまりテーブル内の要素) とネガティブクエリー (つまりテーブルにない要素) の割合によって特徴付けられる。入力ワークロード中のポジティブクエリーの割合
検索スループットのベンチマーク結果を Figure 5 に示す。各フィルターは 192MB を占有し、テストベッドの L3 キャッシュ (20MB) よりはるかに大きい。
blk-BF は、各検索が最初の "0" ビットをフェッチした直後に戻ることができるため、あらゆるクエリーはポジティブの場合に良好な性能を発揮する。しかしポジティブなクエリーが増えると検索の一部として追加のビットを読み取る必要があるためパフォーマンスは低下する。BF のスループットは
対照的に、CF は常に 2 つのバケット7をフェッチするためクエリーが 100% ポジティブでも 100% ネガティブでも同様の高い性能を達成する。
QF はすべてのフィルターの中で最も性能が悪い。QF が 90% 埋まっている場合、検索ではテーブルエントリの長いチェーンを検索し、それぞれをデコードして目的の要素を見つけなければならない。
dl-CBF は ss-CF よりも優れているが BF より 30% 遅い。また各検索で一定数のエントリのみが検索されるためすべてのネガティブクエリーとすべてのポジティブクエリーを処理するときにほぼ同じパフォーマンスが維持される。
異なる占有率: この実験では、これらのフィルターが異なる占有率で満たされた場合の検索スループットを測定する。各フィルターの負荷計数
CF と ss-CF のスループットはネガティブクエリーとポジティブクエリーの両方において、様々な負荷計数レベルに渡ってほぼ安定している。これはより多くの要素が挿入されても読み取りと比較を行うエントリの総数が一定であるためである。
対照的に QF のスループットは負荷が増加すると大幅に低下する。このフィルターは負荷率が大きくなるにつれて目的の要素のより長いエントリのチェーンを検索する。
BF と blk-BF の両方はネガティブクエリーとポジティブクエリーを処理する際に異なる動作をする。ポジティブクエリーの場合、挿入された要素数に関係なく常に合計
dl-CBF は BF とは異なる動作をする。すべての検索がネガティブの場合、このフィルターに含まれる要素数に関係なく 4 つのバケットから合計 16 のエントリを検索する必要があるため、CF と同様に一定のスループットが保証される。ポジティブクエリーの場合、挿入される要素が少なければ 4 つのバケットがすべてチェックされる前に検索が早く返される可能性がある。ただし dl-CBF が約 20% 充填された後はこの差は無視できる程度になる。
7.3 挿入パフォーマンス
満杯のフィルターに含まれる要素の総数と、これらの要素を挿入する総時間に基づいて測定された全体の構築速度を Table 3 に示す。また構築プロセス全体にわたる瞬間的な挿入スループットも調査する。つまり Figure 7 に示すように異なるフィルターが負荷係数のレベルにあるときの挿入スループットを測定する。
Figure 6 に示す検索スループットとは対照的に、どちらのタイプの CF も (全体的な構築速度は依然として高いものの) 充填量が多くなると挿入スループットが低下する。一方で BF と blk-BF はどちらもほぼ一定の挿入スループットを保証する。CF は新しい要素の挿入に成功する前に既存のキーの劣を再帰的に移動させなければならない場合があり、このプロセスは負荷係数が高くなるとより高価になる。対照的に、両方の Bloom フィルターは負荷係数に関係なく常に
また QF は新しい要素を挿入する前に要素のシーケンスをシフトする必要があり、テーブルが一杯になるとこのシーケンスが長くなるため挿入スループットも低下する。
dl-CBF は一定のスループットを維持する。各挿入では最大 4 つのバケット内で空のエントリのみを検索する必要がある。そのようなエントリが見つからない場合、Cuckoo ハッシングのように既存の要素を再配置せずに挿入が停止する。最大負荷係数が 80% に満たないのもこのためである。
7.4 削除パフォーマンス
Figure 8 は削除をサポートするフィルター間の削除パフォーマンスを比較している。実験では、最初は満杯のフィルターから空になるまでキーを削除する。CF が最も高いスループットを達成した。CF と ss-CF はどちらもプロセス全体を通じて安定したパフォーマンスを提供する。dl-CBF はすべてのフィルターの中で 2 番目に性能が良い。QF は満杯に近い状態では最も遅いが、空に近い状態では ss-CF より速い。
評価のまとめ: CF は様々なワークロードや占有レベルにおいて高く安定した検索性能を保証する。挿入スループットはフィルターの充填が進むにつれて低下するが、全体的な構築速度は依然として blk-BF を除く他のフィルタよりも高速である。半ソートを有効にすると Cuckoo フィルターは空間最適化された BF よりも空間効率が良くなる。また検索、挿入、削除も遅くなるが、それでも従来の BF より高速である。
- 5https://github.com/efficient/cuckoofilter
- 6オリジナルの作成者からのソースコードはライセンスの問題により比較のために公開されていない。
8. 結論
Cuckoo フィルターは近似集合メンバーシップクエリーのための新しいデータ構造で、これまで Bloom フィルターを使用して解決されていた多くのネットワーク問題に利用できる。Cuckoo フィルターは次の 3 つの方法で Bloom フィルターを改良している: (1) 要素の動的削除のサポート、(2) 検索性能の向上、(3) 低い偽陽性率 (
我々は、Cuckoo フィルターがさらなる拡張と最適化が可能であり、その利用をさらに推進するものと期待しているが、説明したデータ構造はすでにネットワークと分散システムの実用的な要求に十分適した高速で効率的な構成要素である。
9. ACKNOWLEDGEMENTS
This work is supported by funding from Intel via the Intel Science and Technology Center for Cloud Computing (ISTC-CC), and National Science Foundation under awards CCF-0964474, CNS-1040801, CCF-1320231, CNS-1228598, and IIS-0964473. We gratefully acknowledge the CoNEXT reviewers for their feedback and suggestions; Rasmus Pagh for discussions on analyzing space usage of cuckoo filters that led to many of the insights about the asymptotic behavior; Hyeontaek Lim for code optimizations; and Iulian Moraru, Andrew Pavlo, Peter Steenkiste for comments on writing.
10. REFERENCES
- CityHash. https://code.google.com/p/cityhash/.
- M. A. Bender, M. Farach-Colton, R. Johnson, R. Kraner, B. C. Kuszmaul, D. Medjedovic, P. Montes, P. Shetty, R. P. Spillane, and E. Zadok. Don’t thrash: How to cache your hash on flash. PVLDB, 5(11):1627–1637, 2012.
- B. H. Bloom. Space/time trade-offs in hash coding with allowable errors. Communications of the ACM, 13(7):422–426, 1970.
- F. Bonomi, M. Mitzenmacher, and R. Panigrahy. Beyond Bloom filters: From approximate membership checks to approximate state machines. In Proc. ACM SIGCOMM, Pisa, Italy, Aug. 2006.
- F. Bonomi, M. Mitzenmacher, R. Panigrahy, S. Singh, and G. Varghese. An improved construction for counting bloom filters. In 14th Annual European Symposium on Algorithms, LNCS 4168, pages 684–695, 2006.
- A. Broder, M. Mitzenmacher, and A. Broder. Network Applications of Bloom Filters: A Survey. In Internet Mathematics, volume 1, pages 636–646, 2002.
- B. Chazelle, J. Kilian, R. Rubinfeld, A. Tal, and O. Boy. The Bloomier filter: An efficient data structure for static support lookup tables. In Proceedings of SODA, pages 30–39, 2004.
- J. G. Cleary. Compact Hash Tables Using Bidirectional Linear Probing. IEEE Transactions on Computer, C-33(9), Sept. 1984.
- S. Dharmapurikar, P. Krishnamurthy, and D. E. Taylor. Longest prefix matching using Bloom filters. In Proc. ACM SIGCOMM, Karlsruhe, Germany, Aug. 2003.
- M. Dietzfelbinger and C. Weidling. Balanced allocation and dictionaries with tightly packed constant size bins. Theoretical Computer Science, 380(1):47–68, 2007.
- B. Fan, D. G. Andersen, and M. Kaminsky. MemC3: Compact and concurrent memcache with dumber caching and smarter hashing. In Proc. 10th USENIX NSDI, Lombard, IL, Apr. 2013.
- L. Fan, P. Cao, J. Almeida, and A. Z. Broder. Summary cache: A scalable wide-area Web cache sharing protocol. In Proc. ACM SIGCOMM, Vancouver, BC, Canada, Sept. 1998.
- N. Fountoulakis, M. Khosla, and K. Panagiotou. The multipleorientability thresholds for random hypergraphs. In Proceedings of the Twenty-Second Annual ACM-SIAM Symposium on Discrete Algorithms, pages 1222–1236. SIAM, 2011.
- N. Hua, H. C. Zhao, B. Lin, and J. J. Xu. Rank-Indexed Hashing: A Compact Construction of Bloom Filters and Variants. In Proc. of IEEE Int’l Conf. on Network Protocols (ICNP) 2008, Orlando, Florida, USA, Oct. 2008.
- P. Jokela, A. Zahemszky, C. Esteve Rothenberg, S. Arianfar, and P. Nikander. Lipsin: Line speed publish/subscribe inter-networking. In Proc. ACM SIGCOMM, Barcelona, Spain, Aug. 2009.
- A. Kirsch and M. Mitzenmacher. Less hashing, same performance: Building a better Bloom filter. Random Structures & Algorithms, 33(2):187–218, 2008.
- H. Lim, B. Fan, D. G. Andersen, and M. Kaminsky. SILT: A memory-efficient, high-performance key-value store. In Proc. 23rd ACM Symposium on Operating Systems Principles (SOSP), Cascais, Portugal, Oct. 2011.
- M. Mitzenmacher, A. W. Richa, and R. Sitaraman. The power of two random choices: A survey of techniques and results. In Handbook of Randomized Computing, pages 255–312. Kluwer, 2000.
- M. Mitzenmacher and B. Vocking. The asymptotics of selecting the shortest of two, improved. In Proc. the Annual Allerton Conference on Communication Control and Computing, volume 37, pages 326–327, 1999.
- A. Pagh, R. Pagh, and S. S. Rao. An optimal bloom filter replacement. In Proc. ASM-SIAM Symposium on Discrete Algorithms, SODA, 2005.
- R. Pagh and F. Rodler. Cuckoo hashing. Journal of Algorithms, 51(2):122–144, May 2004.
- F. Putze, P. Sanders, and S. Johannes. Cache-, hash- and space-efficient bloom filters. In Experimental Algorithms, pages 108–121. Springer Berlin / Heidelberg, 2007.
- D. Sanchez, L. Yen, M. D. Hill, and K. Sankaralingam. Implementing signatures for transactional memory. In Proc. the 40th Annual IEEE/ACM International Symposium on Microarchitecture, pages 123–133, Washington, DC, USA, 2007.
- H. Song, S. Dharmapurikar, J. Turner, and J. Lockwood. Fast hash table lookup using extended bloom filter: An aid to network processing. In Proc. ACM SIGCOMM, pages 181–192, Philadelphia, PA, Aug. 2005.
- M. Yu, A. Fabrikant, and J. Rexford. BUFFALO: Bloom f ilter forwarding architecture for large organizations. In Proc. CoNEXT, Dec. 2009.
- D. Zhou, B. Fan, H. Lim, D. G. Andersen, and M. Kaminsky. Scalable, High Performance Ethernet Forwarding with CuckooSwitch. In Proc. 9th International Conference on emerging Networking EXperiments and Technologies (CoNEXT), Dec. 2013.
翻訳抄
要素が集合に含まれているかを効率的に判断するための確率的データ構造である Bloom フィルターの変種で、削除操作において Bloom フィルターより高い性能を示す Cuckoo フィルターに関する 2014 年の論文。Cuckoo ハッシュテーブルに基づいている。要素を格納する 2 つの位置を決めるのに部分キー Cuckoo ハッシングを導入したことで、元の要素を参照しなくても位置を移動できるようにしている。部分キー Cuckoo フィルターは、
- FAN, Bin, et al. Cuckoo Filter: Practically Better Than Bloom. In: Proceedings of the 10th ACM International on Conference on emerging Networking Experiments and Technologies. 2014. p. 75-88.









