Bloom Filter — "Kesinlikle Yok" mu, "Belki Var" mı?
Önce şunu oku: Cache Stratejileri — Defter Ne Zaman Yalan Söyler?
30 saniyede özet
Bloom filter, bir şeyin bir kümede olup olmadığını çok az bellekle cevaplar: ya "kesinlikle yok" ya da "belki var". Hiçbir zaman var olanı kaçırmaz, ama bazen yanlış alarm verir. Boyu ve hash sayısı bu oranı belirler.
Büyük bir düğünün vestiyerinde, her misafir adının gösterdiği birkaç askıya bir kurdele bağlıyor. Birinin gelip gelmediğini merak edersen, onun askılarına bakarsın. Askılardan biri boşsa o kişi kesinlikle gelmemiştir.
-
Bayt: Her ödemede alıcı hesabı şüpheli listesinde mi diye veritabanına soruyoruz. Saniyede binlerce sorgu!
-
Sen: Ama alıcıların neredeyse hepsi temiz. Bu sorguların çoğu boşa.
-
Bayt: Temiz olduğunu veritabanına sormadan nasıl bilebiliriz ki?
-
Bayt: Kesin bilemeyiz, ama çoğu için "kesinlikle yok" diyebiliriz. Birkaç bit yetebilir.
Nasıl çalışır?
Bloom filterBir şeyin kümede olup olmadığını az bellekle cevaplayan bit dizisi. "Kesinlikle yok" ya da "belki var" der; eklenmiş bir şeyi hiç kaçırmaz.Sözlükte gör →, başta hepsi 0 olan bir bit dizisidir. Bir hesap eklerken birkaç hash fonksiyonu hesabın adını dizideki birkaç konuma çevirir ve o bitler 1 yapılır.
Sorgularken aynı konumlara bakılır. Bitlerden biri 0 ise hesap kesinlikle eklenmemiştir. Hepsi 1 ise “belki var” denir, çünkü o bitleri başka hesaplar da doldurmuş olabilir.
Kafam karıştı, daha basit anlat
Eklerken birkaç biti 1 yap. Sorgularken o bitlere bak: biri 0 ise kesinlikle yok.
Bloom filter bir sorguya hangi iki cevabı verebilir?
Bir kayıt eklenirken Bloom filter'da ne olur?
Yanlış alarm nereden gelir?
32 bitlik küçük bir filtreye 20 şüpheli hesap eklendi. Her hesap 1 yerine 3 bit doldursaydı, temiz müşteriler için yanlış alarm azalır mı? Cevabı göster
Hayır, artar. 20 hesap 3’er bit doldurunca küçük dizinin neredeyse tamamı 1 olur. Temiz bir müşterinin bütün bitleri de tesadüfen dolu çıkar.
Adım adım oku
- Her misafir birkaç askıya kurdele bağlar.
- Askılarından biri boşsa: kesinlikle yok.
- Hepsi doluysa: belki var.
- 'Kesinlikle yok' kesindir, 'belki' değildir.
“Belki var” deyip aslında olmayan her cevap bir false positiveOlmayan bir şey için "var" ya da "belki var" denmesi; yanlış alarm. Bloom filter'da yalnızca bu yönde hata olur.Sözlükte gör →’tir. Bloom filter’da bunun tersi, yani var olanı kaçırmak, hiç olmaz.
Yanlış alarm oranını iki şey belirler: dizinin boyu ve hash sayısı. Yer bolsa birkaç hash, temiz bir müşterinin en az bir bitinin boş kalma ihtimalini artırır. Yer darsa her ek hash diziyi daha çabuk doldurur.
Kafam karıştı, daha basit anlat
Yanlış alarm yalnızca “belki var” tarafındadır. Yer ve hash sayısı birlikte ayarlanır.
Bloom filter'da false positive nedir?
Bloom filter hangi durumda en çok işe yarar?
Kendin gör
Kesinlikle yok mu, belki var mı?
Tohum 286701Bit dizisi: 0/32 dolu · eklenen şüpheli hesap: 0
■ dolu bit□ son bakılan bitler
Oynat ya da adımla: önce şüpheli hesaplar eklenir, sonra temiz müşteriler sorgulanır.
Şu an ne oldu?
Küçük (32 bit) · 1 hash
20 şüpheli hesap filtreye eklenecek, sonra 20 temiz müşteri sorgulanacak.
Görevler0/3
Temiz müşterilerin en az yarısına "belki var" dedirtaçık
İpucu
Varsayılan ayarlar yeter.
Hash sayısını artırıp yanlış alarmı çoğaltaçık
İpucu
Küçük bir filtrede dene.
Hiçbir temiz müşteri için veritabanına gitmeaçık
İpucu
Yer ve hash sayısı birlikte.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Küçük filtre, 1 hash: 20 temiz müşteriden 11’ine “belki var” dendi.
- “3 hash” seç. Küçük dizi neredeyse doldu ve yanlış alarm 15’e çıktı.
- “Büyük (256 bit)” ve “1 hash” seç. Yanlış alarm 2’ye düştü.
- Büyükte “3 hash” seç. Hiçbir temiz müşteri için veritabanına gidilmedi.
32 bitlik küçük bir filtreye 20 kayıt ekleniyor. Hash sayısını 1'den 3'e çıkarmak ne yapar?
Filtre "belki var" dedi. Ödeme servisi ne yapmalı?
Tuzaklar
“Belki var” cevabını kesin saymak. Bir müşteriyi “belki şüpheli” diye engellersen temiz insanları cezalandırırsın. “Belki var” yalnızca “veritabanına sor” demektir.
Silmeye çalışmak. Bir biti 0 yapmak, o biti paylaşan başka hesapları da filtreden siler. Silme gerekiyorsa filtreyi baştan kur ya da sayaçlı bir türünü kullan.
Boyu başta yanlış seçmek. Eklenen kayıt sayısı tahminini aşınca bitler dolar ve yanlış alarm hızla artar. Beklenen kayıt sayısını ve kabul edilebilir oranı baştan belirle.
Kafam karıştı, daha basit anlat
“Belki” kesin değildir, bit silinmez, boyu baştan doğru seç.
Bir hesap şüpheli listesinden çıkarıldı. Bloom filter'da o hesabın bitlerini 0 yapmak neden tehlikeli?
Aşağıdaki örnek bir ödeme servisinden: şüpheli hesap listesi açılışta bir Bloom filter’a yükleniyor, “kesinlikle yok” diyenler için veritabanına gidilmiyor.
Derinleş · Şüpheli hesap kontrolü: veritabanından önce Bloom filter 3 dosya · ~58 satır · ilk okumada atlayabilirsin
Kendini sına
Bloom filter eklenmiş bir kayıt için "kesinlikle yok" diyebilir.
Filtre 1 milyon kayıt için kuruldu; liste 5 milyona çıktı. Ne olur?
Aklında kalacak üç şey
- 1 Bloom filter iki cevap verir: "kesinlikle yok" ya da "belki var". Eklenmiş bir şey için asla "kesinlikle yok" demez; yanlış alarm yalnızca "belki var" tarafında olur.
- 2 Bloom filter en çok, pahalı bir sorgudan önce bir kapı bekçisi olarak işe yarar. "Kesinlikle yok" diyenler için veritabanına hiç gidilmez.
- 3 Yanlış alarm oranını bit dizisinin boyu ve hash sayısı belirler. Daha çok hash yalnızca yer varsa işe yarar; küçük bir dizide bitleri çabuk doldurur.
4 kart sonraki derste seni bekliyor