最近では、ストリーミングシステムを見たときには、かならず一度戦略はそう、今日その関連知識(非コバン、比較的薄いベース)を整理して、ブルームフィルタ(ブルームフィルタ)の最適化を使用することができます言及しました。
原理の応用:
- ブルームフィルタは、偽陽性が、決して偽陰性を返すことができます。
- ブルームフィルタは、特定のデータが存在しないかどうかを決定することができるが、データが存在しなければならないかどうかを決定することができません。
- 従って、正確ワンスポリシーを確保するために、データを再確認するために使用することができます
ブルームフィルタとは何ですか?
- 彼は、(0、1)それ自体で非常に長いバイナリーベクターであり、以下はブルームフィルタ16の長さは、デフォルト値は0であると仮定されます
値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
座標 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
- 結果のハッシュハッシュ4,7,12それぞれは、次のようにデータを追加することとします。
値 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
座標 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
- 追加されたデータは、4を占める7、12 3つの格子、それ自体は、ブルームフィルタのデータを格納しないで完了するが、ランダムマッピング関数のランダム系列の利用を位置算出され、その後、バイナリーベクターを埋めます。
- データが繰り返されるかどうかを決定するために再度データを仮定すると、データのみを占有するデータグリッドを表示するハッシュ、限り、グリッドの値は、1ではないとして、この図が表すことが必要ですそれらのない1。
- しかし、データの一部に対応する格子のハッシュ値のハッシュ値が1である場合には、データは、必ずしも所与の一定の繰り返しを表すものではない、他のデータは、ハッシュ関数の結果により算出することができるも同様です。(しかし、非常に小さな確率)[モジュロハッシュは、異なるオブジェクトが同一であってもよいです]
長所と短所
- 長所:十分なそれは完全なデータ・ストレージではないので、非常に少ないメモリを取るので、新しい問い合わせ速いです
- 短所:
- データの増加、偽陽性率が高くなると
- データを削除しないでください(実際に体全体に影響を与え、それがグリッドに格納されている他のデータに影響します)
- かどうかのデータが存在しなければならないだけでなく、データが存在しなければならないかどうかを判断することはできません。
再検査のデータは、ポリシーを使用します
限りタスクブルームフィルタデータが存在しないように、挿入を行うことができます。
ときにタスクブルームフィルタデータの重複、データが繰り返されてもよいです。
FARブルームフィルタ(制限利用できるの反復計算):
[F \約- ^ K \(1 E ^ \ FRAC-NK {} {M})] \
M:バイナリーベクターのサイズ(ビット)K:ハッシュ操作の数
N:これはキーの数を加えました
以来、偽陽性率を計算することができ、少ないデータであれば、データが再度濾過誤判定を徐々に除去することができるが繰り返されるように繰り返されてもよいです。
これらのデータは、データが繰り返されていない、1限り非繰り返しデータを決定しました。
Googleのオープンソースグアバによってブルームフィルタを実現
グアバは、GoogleのオープンソースのJava言語ツールキットの一般的な方法であります
座標グアバMavenを導入することにより:
<!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.0-jre</version> </dependency>
テストコードの実行を書きます
package com.ronnie.bloom; import com.google.common.hash.BloomFilter; import com.google.common.hash.Funnels; public class BloomDemo { // 预计要插入的数据 private static int size = 1000000; // 预估的误判率 private static double falseProbability = 0.01; private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, falseProbability); public static void main(String[] args) { // 插入数据 for (int i = 0; i < size; i++){ bloomFilter.put(i); } int count = 0; for (int i = size; i < size * 2; i++){ if (bloomFilter.mightContain(i)){ count++; System.out.println(i + "被误判了"); } } System.out.println("总共误判了 " + count + " 个数"); } }
出力結果:
1999501被误判了 1999567被误判了 1999640被误判了 1999697被误判了 1999827被误判了 1999942被误判了 总共误判了 10314 个数
\ [\ FRAC {10314} {1000000} \約0.01 \]