Bloom filtreleri, hesaba önbelleği bile hesaba katarak karmalardan daha mı hızlıdır?


16

Bloom filtreleri, Int'nin sabit bir zamanda% 99 kesinliğe sahip bir kümede olup olmadığını belirleyebileceğinizi düşündüğünüzde gerçekten harika görünüyor. Ancak, karma ile, çoğu zaman belleğe yalnızca bir kez eriştiğiniz tek farkla, hash'ler de olabilir. Bloom filtreleri ile, onlara tamamen uzak yerlerde istek başına ~ 7 kez erişmeniz gerekir , böylece istek başına birkaç önbellek kaçırırsınız.

Bir şey mi kaçırıyorum?


Tamamen uzak yerler ne? Sadece m bitleri vardır. Bu muhtemelen tek bir kayıtta veya en kötü ihtimalle tek bir önbellek satırına sığar.

1
@delnan AFAIK 10 bit / element civarında bir şey kullanıyor, değil mi? Yani, binlerce öğe için - yani büyük veri depoları - kesinlikle bir önbelleğe sığmayacaktır. Yani, kkarma kullanıyorsanız , muhtemelen kokuma başına önbellek özlüyor olursunuz . Öte yandan karma tablolar, cevabınızı çoğu zaman 0 önbellek özlemesiyle alacağınızı garanti eder - çarpışmalar nadirdir.
MaiaVictor

K bitiniz var, nokta. Tüm elemanlar aynı sabit bit sayısını etkiler, bu nedenle yanlış pozitif oran giriş sayısına bağlıdır.

Yanıtlar:


33

İki veri yapısının karma çarpışmalarla nasıl başa çıktığı eksik. Bloom filtreleri gerçek değerleri depolamaz, bu nedenle gerekli alan belirlenen dizinin sabit boyutudur. Bunun yerine geleneksel bir karma kullanırsanız, verdiğiniz tüm değerleri depolamaya çalışır, böylece zamanla büyür.

Basitleştirilmiş bir karma işlevini düşünün (sadece örnek için!) f(x) = x % 2. Şimdi giriş aşağıdaki tamsayılar: 2, 3, 4, 5, 6, 7.

Standart Hash: Verilen değerler hash edilecektir ve bu nedenle çok sayıda çarpışma ile sonuçlanıyoruz.f(2) = f(4) = f(6) = 0 ve f(3) = f(5) = f(7) = 1. Bununla birlikte, karma tüm bu değerleri depolar ve 8içinde saklanmadığını söyleyebilir. Bunu nasıl yapıyor? Çarpışmaları izler ve tüm değerleri aynı karma değerle depolar, ardından sorguladığınızda, ek olarak sorgunuzu karşılaştırır. Bu yüzden haritayı şu şekilde sorgulayalım 8: f(8) = 0bu nedenle, daha önce eklediğimiz bir kovaya bakacağız ve bunun girişin bir parçası olmadığını 2, 4, 6söylemek için 3 karşılaştırma yapması gerekiyor 8.

Bloom filtresi: Normalde, her bir giriş değeri kfarklı hash işlevlerine karşı hash edilir. Yine, basitlik için, sadece tek hash fonksiyonunu kullandığımızı varsayalım f. Daha sonra 2 değer dizisi ihtiyaç ve biz girdi karşılaştığınızda 2bunun nedeni demektir f(2) = 0biz pozisyonda dizi değerini 0değere 1. Aynı şey 4ve için de geçerlidir 6. Benzer şekilde, girdiler3, 5, 7 her biri dizi konumunu 1değere ayarlar 1. Şimdi biz sorgu 8giriş parçası: f(8) = 0pozisyonundaki dizi 0olduğunu 1, bu nedenle çiçek filtre olacak yanlış İstem 8gerçekten giriş parçasıydı.

Biraz daha gerçekçi olmak için ikinci bir hash fonksiyonu eklediğimizi düşünelim g(x) = x % 10. Bunun üzerine, giriş değeri 2iki karma değerlerine yol açar f(2) = 0ve g(2) = 2ve bunlara karşılık gelen iki dizi pozisyonu ayarlanacak1 . Tabii ki, dizi şimdi en azından boyutta olmalıdır 10. Ancak sorguladığımızda 8diziyi konumu 8nedeniyle kontrol edeceğiz g(8) = 8ve bu konum hala devam edecek 0. Bu nedenle ek karma işlevler, alacağınız yanlış pozitifleri azaltır.

Karşılaştırma: Bloom filtresi, rasgele dizi konumlarına erişildiği kanlamına gelen sağlama işlevlerini kullanır k. Ama bu rakam kesin. Bunun yerine karma yalnızca size amortismanlı sabit bir erişim süresi garanti eder, ancak karma işlevinizin ve giriş verilerinizin niteliğine bağlı olarak üretimini kaldırabilir. Bu nedenle, oluşturulmuş olgular dışında genellikle daha hızlıdır.

Ancak, bir karma çarpışmanız olduğunda standart karma, saklanan değerlerin sorgu değerine eşitliğini kontrol etmelidir. Bu eşitlik kontrolü keyfi olarak pahalı olabilir ve asla bir çiçek filtresi ile gerçekleşmez.

Alan açısından, çiçeklenme filtresi sabittir, çünkü belirlenen diziden daha fazla bellek kullanmaya hiç gerek yoktur. Öte yandan, karma dinamik olarak büyür ve çarpışan değerleri takip etmek zorunda kaldığı için çok daha büyük olabilir.

Değiş tokuş: Artık neyin ucuz olduğunu ve neyin olmadığını ve hangi koşullar altında değiştiğini bildiğinize göre ödünleşmeyi görebilmelisiniz. Bloom filtreleri, daha önce bir değerin görüldüğünü çok hızlı bir şekilde tespit etmek istiyorsanız, ancak yanlış pozitiflerle yaşayabiliyorsanız harika. Öte yandan, çalışma zamanınızı tam olarak değerlendirememe fiyatında garantili doğruluk istiyorsanız, ancak ortalamanın çok daha yavaş olabileceği zaman zaman dejenere olmuş vakaları kabul edebileceğiniz karma haritayı seçebilirsiniz.

Benzer şekilde, sınırlı bir bellek ortamındaysanız, bellek kullanım garantisi için bloom filtrelerini tercih etmek isteyebilirsiniz.


Mükemmel cevap. Kafa karıştırdığım şey buydu. Aslında her veri yapısının en iyi kullanım durumları vardır ve farklı düşünce değiş tokuşa bağlıdır.
Richard

Gerçekten de uygun bir örnekle çok iyi bir açıklamadır. Öyleyse 'k' değeriyle nasıl gideriz? Sahip olduğumuz toplam değer sayısına bağlı mı?
itsraghz

5

Bloom filtreleri ve karmaları için kullanım durumları farklıdır ve çoğunlukla ayrıktır, bu nedenle doğrudan karşılaştırma mantıklı değildir. Ayrıca farklı ödünleşmelerle karma çarpışmaları ele almanın birçok yolu olduğundan uygulamaların teknik detaylarına bağlı olacaktır.

Bloom filtresi, elemanın büyük bir sette olup olmadığını cevaplayabilir makul bir olasılıkla setler , ancak tam olarak değil, az miktarda bellek kullanarak . Trilyonlarca element gibi devasa. Ama asla kesin değiller. Yanlış pozitif miktarını yalnızca daha fazla bellek veya daha fazla karma işlevi kullanarak azaltabilirsiniz.

Öte yandan hash tabloları kesin, ancak seti saklamaları gerekiyor. Bu yüzden trilyonlarca element, terabayt bellek gerektirir (ve bu sadece Amerikan trilyonları). Ayrıca, çiçek filtrelerinin yapamadığı her öğe için ekstra veri saklayabilirler.

Bu nedenle, çiçek filtreleri, büyük bir kümenin (belleğe sığmayan veya istemciye aktarılması pratik olmayan) bazı üyeler için veri almak için yavaş bir yönteminiz olduğunda (sorgulama sunucusu, diskten okumalar vb.) veya böyle) ve kümede olmayan nesneler için yavaş işlemi çalıştırmaktan kaçınmak istersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.