Bloom Filter’ı Örneklerle Anlamak
(llimllib.github.io)- Bloom filter, bir küme içindeki bir öğenin varlığını hızlıca kontrol etmek için kullanılan, bellek açısından verimli bir olasılıksal veri yapısıdır
- Bir öğenin kümede kesin olarak bulunmadığını ya da belki bulunabileceğini söyler; yanlış pozitif olasılığı vardır
- Temel yapı, bit vektörü ile birden fazla hash fonksiyonu kullanarak her öğeye karşılık gelen bitleri 1 yapar
- Hata oranı ve performans, filtrenin boyutu ile hash fonksiyonu sayısına göre belirlenir ve kullanım amacına göre ayarlanabilir
- Önerilen hash fonksiyonları, en uygun ayar yöntemi, alan verimliliği ve gerçek kullanım örnekleri de tanıtılır
Bloom Filter Nedir
- Bloom filter, belirli bir öğenin bir kümede bulunup bulunmadığını hızlı ve bellek açısından verimli şekilde belirleyen bir veri yapısıdır
- Bu verimlilik için bloom filter olasılıksal bir veri yapısıdır; sorgu sonucu ya "kümede kesinlikle yok" ya da "kümede olabilir" şeklinde ayrılır
- Bloom filter’ın temel yapısı bit vektörüdür
- Öğe eklenirken her öğe birden fazla kez hash edilerek ilgili indekslerdeki bitler 1 yapılır
- Her hash fonksiyonundan çıkan indekse karşılık gelen bitlerin tümü 1 ise "bulunabilir" olarak değerlendirilir; aksi halde "kesinlikle yok" kabul edilir
Çalışma Prensibi Örneği
- Birden fazla hash fonksiyonu (ör. Fnv, Murmur) üzerinden öğeler birden çok bit indeksine eşlenir
- Öğe eklenirken hesaplanan indekslerdeki bitler 1’e çevrilir
- Belirli bir öğenin varlığı kontrol edilirken, aynı hash fonksiyonlarıyla üretilen indekslerin hepsi 1 ise "bulunabilir" kabul edilir
- Eğer bu bitlerden biri bile 0 ise "kümede yok" olduğu kesin olarak anlaşılır
- Bu nedenle false positive (yanlış pozitif) olasılığı ortaya çıkar
İleri Konular
Not: Yazarın bloom filter’ı gerçek büyük ölçekli bir serviste uygulamış deneyimi yoktur
Hash fonksiyonu seçimi
- Bağımsız ve uniform dağılıma sahip hash fonksiyonları önerilir
- Kriptografik hash fonksiyonları (
sha1vb.) yavaş olduğu için uygun değildir - Hızlı ve basit hash fonksiyonlarına örnek olarak Murmur, xxHash, Fnv, HashMix verilebilir
- Gerçek bir örnekte md5’ten murmur’a geçildiğinde %800’ün üzerinde hız artışı yaşanmıştır
Bloom filter boyutunu belirleme
- Filtre boyutu (m) büyüdükçe yanlış pozitif oranı azalır
- Yanlış pozitif oranı genellikle (1-e^(-kn/m))^k ile yaklaşık hesaplanabilir
- Beklenen öğe sayısı (n), filtre boyutu (m) ve hash fonksiyonu sayısı (k) uygun şekilde belirlenmelidir
Hash fonksiyonu sayısı kaç olmalı?
- Hash fonksiyonu sayısı arttıkça hız düşer ve filtre daha hızlı dolar
- Çok az olursa yanlış pozitif oranı yükselir
- İdeal k değeri (m/n)ln(2) ile hesaplanır
- Tasarım sırasında şu adımlar izlenir:
- Beklenen öğe sayısı n tahmin edilir
- Bit sayısı m belirlenir
- En uygun k hesaplanır
- İstenen hata oranının çıkıp çıkmadığı kontrol edilir; çıkmıyorsa m ayarlanır
Performans ve alan verimliliği
- Bloom filter’da öğe ekleme/varlık kontrolü O(k) zaman karmaşıklığına sahiptir
- Alan verimliliği, kabul edilen hata oranı ile öğe aralığına göre belirlenir
- Öğe aralığı kabaca da olsa öngörülemiyorsa hash tablosu ya da ölçeklenebilir bloom filter daha iyi olabilir
Kullanım örnekleri
- Ayrıntılı kullanım örnekleri için Wikipedia incelenebilir
- C. Titus Brown, bloom filter’ın biyoinformatikteki kullanım örneklerini sunar
Referanslar
- Broder, Mitzenmacher : Network Applications of Bloom Filters: A Survey — bloom filter’a genel bakış sunan bir makale
- Wikipedia – Bloom Filter
- Kirsch, Mitzenmacher: Less Hashing, Same Performance
- Almeida ve diğerleri: Scalable Bloom Filters
1 yorum
Hacker News görüşü
bloomiledemonstrators(sonunda boşluk var) fnv: 7, murmur: 12 değerlerinde çakışıyor