Bloom Filter di Java menggunakan Jambu Batu

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat konstruk penapis Bloom dari perpustakaan Jambu . Penapis Bloom adalah struktur data probabilistik yang cekap memori yang dapat kita gunakan untuk menjawab persoalan sama ada elemen yang diberikan ada dalam satu set atau tidak .

Tidak ada negatif palsu dengan penapis Bloom, jadi apabila ia kembali palsu , kita dapat yakin 100% bahawa elemen tersebut tidak ada dalam kumpulan.

Walau bagaimanapun, penapis Bloom dapat mengembalikan positif positif , jadi apabila ia kembali benar , ada kemungkinan besar elemen tersebut ada dalam set, tetapi kita tidak dapat yakin 100%.

Untuk analisis yang lebih mendalam mengenai bagaimana penapis Bloom berfungsi, anda boleh membaca tutorial ini.

2. Ketergantungan Maven

Kami akan menggunakan penerapan penapis Bloom oleh Jambu, jadi mari kita tambahkan kebergantungan jambu :

 com.google.guava guava 29.0-jre 

Versi terbaru boleh didapati di Maven Central.

3. Mengapa Menggunakan Penapis Bloom?

Penapis Bloom direka untuk menjimatkan ruang dan cepat . Semasa menggunakannya, kita dapat menentukan kebarangkalian tanggapan positif palsu yang dapat kita terima dan, menurut konfigurasi itu, penapis Bloom akan menempati sedikit memori yang dapat.

Oleh kerana kecekapan ruang ini, penapis Bloom akan sesuai dengan memori walaupun untuk sebilangan besar elemen. Beberapa pangkalan data, termasuk Cassandra dan Oracle, menggunakan penapis ini sebagai pemeriksaan pertama sebelum masuk ke cakera atau cache, misalnya, ketika permintaan untuk ID tertentu masuk.

Sekiranya penapis mengembalikan bahawa ID tidak ada, pangkalan data dapat menghentikan pemprosesan permintaan lebih lanjut dan kembali ke klien. Jika tidak, ia pergi ke cakera dan mengembalikan elemen jika terdapat pada cakera.

4. Membuat Penapis Bloom

Anggaplah kita mahu membuat penapis Bloom hingga 500 Integer dan kita boleh bertolak ansur dengan kebarangkalian satu persen (0,01) kemungkinan positif palsu.

Kita boleh menggunakan kelas BloomFilter dari perpustakaan Jambu untuk mencapainya. Kita perlu memasukkan bilangan elemen yang kita harapkan dimasukkan ke dalam penapis dan kebarangkalian positif palsu yang diinginkan:

BloomFilter filter = BloomFilter.create( Funnels.integerFunnel(), 500, 0.01);

Sekarang mari kita tambahkan beberapa nombor ke penapis:

filter.put(1); filter.put(2); filter.put(3);

Kami hanya menambahkan tiga elemen, dan kami menentukan bahawa jumlah penyisipan maksimum adalah 500, jadi penapis Bloom kami akan memberikan hasil yang sangat tepat . Mari kita mengujinya menggunakan kaedah mayContain () :

assertThat(filter.mightContain(1)).isTrue(); assertThat(filter.mightContain(2)).isTrue(); assertThat(filter.mightContain(3)).isTrue(); assertThat(filter.mightContain(100)).isFalse();

Seperti namanya, kita tidak dapat yakin 100% bahawa elemen yang diberikan sebenarnya ada di dalam saringan ketika kaedah itu kembali benar .

Apabila mungkinContain () kembali benar dalam contoh kita, kita dapat yakin 99% bahawa elemen tersebut ada di dalam saringan, dan ada kebarangkalian satu persen bahawa hasilnya adalah positif palsu. Apabila penapis kembali palsu , kita dapat yakin 100% bahawa elemen tersebut tidak ada.

5. Penapis Bloom yang terlalu jenuh

Semasa kami merancang penapis Bloom kami, adalah mustahak kami memberikan nilai yang cukup tepat untuk bilangan elemen yang diharapkan . Jika tidak, penapis kami akan mengembalikan positif positif pada kadar yang jauh lebih tinggi daripada yang dikehendaki. Mari lihat contoh.

Anggaplah kita membuat penapis dengan kebarangkalian positif-positif yang diingini satu peratus dan beberapa elemen yang dijangkakan sama dengan lima, tetapi kemudian kita memasukkan 100,000 elemen:

BloomFilter filter = BloomFilter.create( Funnels.integerFunnel(), 5, 0.01); IntStream.range(0, 100_000).forEach(filter::put); 

Oleh kerana bilangan elemen yang dijangkakan sangat kecil, penapis akan menggunakan memori yang sangat sedikit.

Namun, apabila kami menambahkan lebih banyak item daripada yang dijangkakan, penapis menjadi terlalu tepu dan mempunyai kebarangkalian yang lebih tinggi untuk mengembalikan hasil positif palsu daripada satu peratus yang diinginkan:

assertThat(filter.mightContain(1)).isTrue(); assertThat(filter.mightContain(2)).isTrue(); assertThat(filter.mightContain(3)).isTrue(); assertThat(filter.mightContain(1_000_000)).isTrue();

Perhatikan bahawa mightContatin () kaedah kembali benar walaupun nilai yang kita tidak memasukkan ke dalam penapis sebelumnya.

6. Kesimpulannya

Dalam tutorial ringkas ini, kami melihat sifat probabilistik struktur data filter Bloom - memanfaatkan pelaksanaan Jambu Batu .

Anda boleh mendapatkan pelaksanaan semua contoh dan coretan kod ini dalam projek GitHub.

Ini adalah projek Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.