/ Filter kvitnutia alebo khučík? - algoritmus, hash, filter

Filter kvitnutia alebo khučík? - algoritmus, hash, filter

Čo uprednostňujete a prečo?

Obidva môžu byť použité na splnenie podobných úloh, ale ja som zvedavý, ako vidieť, čo ľudia použili v skutočných aplikáciách a ich odôvodnenia.

odpovede:

9 pre odpoveď č. 1

Bloom filtre a kukučky filtre sa používajú v podobných situáciách, ale tam je veľa rozdielov, ktoré zvyčajne určujú, čo je lepšia voľba.

Filtre Bloom sa interne používajú v databázemotory, najmä Apache Cassandra. Dôvody sú podľa iných plagátov, aby sa znížili náklady na pomalé nastavenie. V podstate akékoľvek "funguje to možno alebo určite neexistuje" operácia s vysokou cenou môže použiť filter Bloom na zníženie počtu vykonaných šekov.

Ďalším bežným príkladom s dnešným modelom SaaSby bola vzdialená služba REST s cenou za hovor. Akékoľvek volanie rozhrania API s binárnou odpoveďou, ako napríklad "je táto adresa neplatná", môže použiť filter na vykrytie, ktorý eliminuje viac ako 90% duplicitných dopytov! Všimnite si, že od filtrov Bloom a Cuckoo majú falošné pozitívy nie sú užitočné pre inverznú operáciu "je táto adresa platná"

Dôležité je mať na pamäti, že Bloom a kukačkafiltre nemajú žiadne falošné negatívy. To robí tieto filtre užitočné pri kontrolách, ako je "to určite nie je alebo možno spam", ale nie je užitočné pre operácie, kde falošné pozitíva sú neprijateľné, napríklad kontrola užívateľských oprávnení. V tomto aspekte môžu byť koncepčne považované za opak cache. Filtre Bloom / Cuckoo a vyrovnávacie pamäte sa používajú predovšetkým na zníženie nákladov na drahé operácie s booleovskou odpoveďou, s výnimkou, že pamäte cache nemajú žiadne falošné pozitíva a Bloom / Cuckoo nemajú žiadne falošné negatívy.

Pozoruhodné rozdiely medzi kukuricou / kvetom zahŕňajú:

  • Kombinácia. Filtre Bloom môžu byť efektívne zlúčené, ak sú vytvorené s rovnakými parametrami. Rýchlo as malou šírkou pásma. To je dôvod, prečo ich vidíte často používané v masovo distribuovaných systémoch a výmena filtrov Bloom je rýchla. Kukucké filtre nie sú ľahko kompilovateľné, takže sú za týchto okolností menej užitočné.

  • Falošne pozitívna miera. Kukucké filtre sú efektívnejšie. Mnohé prípady použitia pre obidve štruktúry sú zamerané na vytváranie sietí na nízkej úrovni. Pri slabom hardvéri môže byť dôležitá ~ 40% vyššia účinnosť kukučkových filtrov na rovnakú falošne pozitívnu mieru. Referenčná implementácia, v c ++, zoraďuje položky do každého vedra na ďalšie úspory priestoru, pričom využíva pozíciu položky v kóde na uloženie menších odtlačkov prstov. Zdá sa, že dodatočné knižnice, o ktorých sa budem ďalej (vrátane mojej) robiť to.Ak niekto niekedy používa moju knižnicu môžem pridať to :).

  • Konštantná chybovosť pozitívna. Filtre Bloom majú asymptoticky horšie falošne pozitívne hodnoty, pretože prevyšujú navrhnutú veľkosť. Môžete vkladať položky navždy, ale nakoniec vaša falošne pozitívna sadzba bude takmer 100%. Kukucké filtre, ktoré sú založené na hádzaní cukou, majú nastavenú kapacitu, kde sa vkladania skutočne zlyhajú. Opakované vloženie nepravidelných hash položiek môže spôsobiť, že kukucké filtre nebudú zasunuté, možno ešte pred navrhovanou úrovňou plnenia.

  • Rýchlosť. Toto je subjektívne a závisí veľa na hardware, ale kukucké filtre sú vo všeobecnosti rýchlejšie v priemernom prípade (podľa mojich skúseností). Väčšina návrhov filtrov Bloom spúšťa dvakrát funkciu hash. Pri používaní bezpečných funkcií hašovania môže to byť veľký handicap v porovnaní s kukučkovými filtrami, ktoré iba raz vložili položky. Kód, ktorý som videl, používa rôzne funkcie hash pre filtre Bloom a kukačky. Google Guava Bloom používa Murmur3, mnohé iné implementácie používajú SHA1 alebo niečo iné. Ak sa dá použiť kolízie hash, použite prípad, uistite sa, že knižnica používa bezpečný hash. Dôležité je vedieť, že filtre Bloom majú približne konštantný čas na vloženie, zatiaľ čo kukucké filtre majú konštantný časový prípad AVERAGE. Keď sa kukucké filtre dostanú do niekoľkých percent z kapacity, rýchlosť vloženia výrazne spomalí. Dokonca aj vtedy sa spomalí len rýchlosť vloženia, všetky ostatné operácie sú konštantné priemerné.

  • Flexibilita. Filtre na kvitnú len podporujú vložiť a obsahovať. Kukucké filtre navyše podporujú vymazanie a obmedzené počítanie. V referenčnej koncepcii môžu kukucké filtre určiť, koľkokrát bol položka vložená až 7 krát. Filtre Bloom môžu určiť len áno-nie. Kukucké filtre tiež podporujú mazanie vložených položiek, čo je veľká pozitívna v mnohých prípadoch použitia v porovnaní s Bloom. Keď používate filtre Bloom, je to úplne štandardné, ak chcete filtrovať znova, keď je "plné" (odhadovaná falošne pozitívna miera prekračuje prah), pretože nemôžete odstrániť staré položky. Všimnite si, že pri vkladaní filtra začať zlyhať, takže v závislosti od prípadu použitia to môže byť nemožné.V niektorých situáciách Cuckoo filtre sú užitočnejšie, pretože môžete odstrániť položky zostať vo vnútri filtra limitov namiesto prestavby.

  • Podpora. Kukucké filtre sú nové a stabilné knižnice pre mnohé jazyky jednoducho neexistujú.

Najväčšou výhodou filtrov Bloom je tomajú vo väčšine jazykov vyspelšiu podporu knižnice. Matematiku za filtrov Bloom je lepšie pochopiť aj vedci. Väčšina vlastností kukátkových filtrov bola stanovená empiricky, zatiaľ čo filtre Bloom majú pevný numerický základ. Toto vylučuje kukucké filtre v reálnom čase a kritické systémy, ktoré musia mať overenie ich výkonu, hoci experimentálne dôkazy ukazujú, že kukucké filtre majú vo väčšine prípadov lepšie výsledky.

Bezohľadný konektor: Som vývojár kukátkovej knižnice pre Java. CuckooFilter4J , Chýba polovičný sortiment vedier používaný vpapier, takže efektivita priestoru je o niečo nižšia ako referenčná implementácia. V projekte readme mám odkazy na iné implementácie, o ktorých som si vedomý. Ktorá štruktúra je lepšia závisí od vášho prípadu použitia, ale väčšinou z toho, či pre váš jazyk existuje pevná implementácia filtrov kukučiek.

Určite by ste sa mali pozrieť na zdrojskôr ako použijete vo výrobe filter Cuckoo / Bloom. Čítal som rôzne libs skôr, ako som písal vlastné ... mnohé z nich mali tiché veľkosti limitov kvôli 32-bitové podkladové pole alebo zrejmé problémy s výkonom. Väčšina mal nulové testy. Implementácia Google Guava Bloom mala zďaleka najlepšiu kvalitu kódu a testy (a podporuje 64 bitové limity). Jediné nedostatky v Guave Bloom je to, že nemá možnosť používať bezpečnú hashovú funkciu a isn " t viacvláknové.

Vo výrobnom systéme, ktorý by ste chceliviac závitov na rýchlosť. Odpoveďou pre Guava Bloom je vytvoriť iný filter pre každú niť a niekedy je kombinovať. Keďže kukucké filtre nemožno kombinovať, pridal som do mé kukátkovej filtračnej knižnice súbežné závitovanie. Druhý som si vedomý, že nie sú bezpečné alebo sú súčasne.


8 pre odpoveď č. 2

Čo dáte prednosť vínu alebo syru?

A Bloom filter je pre, keď máte obmedzený priestor, vysoká dotaz náklady, a väčšinou negatívne dotazy.
V takom prípade Bloom filter s 8 bitov na kľúč a 4 hašovacie funkcie vám dáva 2,5% falošne pozitívne sadzba; spracúvate dotazy takmer 40-krát rýchlejšie ako predtým, za cenu, že 1 bajt na kľúč.

Na druhej strane, ak niektorý z predchádzajúce podmienky nemajú, a hašovacia tabuľka splnomocnení cache zmysel, hoci zrejme bude trvať oveľa viac ako jeden bajt na vstup :-)

Môžete dokonca preskočiť cez pevný okraj prípady Kukučka hashing Ak to "s cache. To tiež robí problémy zvýšenie veľkosti Kukučka hašovacie tabuľky (alebo niečo iné ako lineárne hash) diskutabilný.


5 pre odpoveď č. 3

Kukučka Filter.

"Hodiny kukučky Filter: prakticky lepšie ako kvet." Bin ventilátor, David Andersen, Michael Kaminský, Michael Mitzenmacher CoNext 2014. http://dx.doi.org/10.1145/2674005.2674994

Jeden z autorov" blog:

Dovoľte mi popísať kukučky filter a niektoré čo "je kniha pre vás.Ak sa chcete vyhnúť sa technické diskusie, všetko, čo potrebujete vedieť je, že primerane veľké veľkosti súborov pre rovnakú mieru falošne pozitívne ako zodpovedajúce Bloom filter, Kukučka filtre použiť menej miesta ako kvet filtre, sú rýchlejšie na vyhľadávanie (ale pomalší na vkladanie / na výstavbu), a prekvapivo aj Povoliť odstránenia kľúčov (ktoré kvitnú filtre nemôžu robiť).Ak si chcete pozrieť na kód, tam "s aj GitHub úložisko pre vás s kódom pre kukučku filtre.


2 pre odpoveď № 4

Dávam prednosť kukučky hashing. Som opatrný falošných poplachov, ktoré môžu zobrazovať s kvet filtre vyššie výplne faktory.
Použil kukučky hashing v aplikácii, kde sme mali veľmi veľké hašovacie tabuľky a behali do pamäte tlak otázky.Prečítajte si môj eCollections knižnica v http://codeplex.com/ecollections na účely vykonávania variant kukučky hashing.

so srdečným pozdravom


0 pre odpoveď č. 5

Ak môžete tolerovať falošných poplachov a priestor je kritický, používam Bloom filter, pretože to zaberie menej miesta.Inak používam hash.