Moderne, de haute performance filtre de bloom en Python?
Je suis à la recherche d'une qualité de production bloom filtre de mise en œuvre en Python pour manipuler un assez grand nombre d'éléments (dire 100M à 1B éléments avec 0,01% taux de faux positifs).
Pybloom est une option, mais il semble être à montrer son âge qu'il jette DeprecationWarning erreurs sur Python 2.5 sur une base régulière. Joe Gregorio a également une mise en œuvre.
Exigences de la recherche rapide de la performance et de la stabilité. Je suis aussi ouvert à la création d'interfaces Python particulièrement bon c/c++ implémentations, ou même à Jython si il y a une bonne implémentation de Java.
Manque que, des recommandations sur un tableau de bits /vecteur de bits de la représentation qui peut gérer ~16E9 bits?
- D'intérêt, pouvez-vous nous expliquer quel est le problème avec les implémentations existantes (en particulier PyBloom)? Il peut être "long dans la dent", mais si cela fonctionne et n'a pas besoin de fixation, qui sonne comme un plus.
- Oddthinking, mis à jour avec quelques explications.
Vous devez vous connecter pour publier un commentaire.
Je suis récemment allé en bas de ce chemin; si elle ressemble à ma demande a été légèrement différente. J'ai été intéressé par approximation de l'ensemble des opérations relatives à un grand nombre de chaînes.
Vous faites la clé de l'observation qu'un rapide vecteur de bits est requis. Selon ce que vous voulez mettre dans votre filtre de bloom, vous pouvez également besoin de penser à la vitesse de l'algorithme de hachage(s) utilisé. Vous trouverez peut-être ce bibliothèque utile. Vous pouvez aussi bricoler avec le nombre aléatoire technique utilisée ci-dessous que seuls les hachages votre touche une seule fois.
En termes de non-Java tableau de bits implémentations:
J'ai construit mes fleurs filtre à l'aide de BitVector. J'ai passé un certain temps de profilage et de l'optimisation de la bibliothèque et de contribuer en retour mes patches pour Avi. Aller à cette BitVector lien et faites défiler vers le bas pour les accusés de réception dans v1.5 pour plus de détails. En fin de compte, j'ai réalisé que le rendement n'était pas l'objectif de ce projet et a décidé à l'encontre de l'utiliser.
Voici un code que j'avais traîner. Je peut mettre cela sur google code en python-floraison. Suggestions de bienvenue.
Aussi, dans mon cas, j'ai trouvé utile de disposer d'une plus rapide count_bits fonction pour BitVector. Déposer ce code dans BitVector 1,5 et il devrait vous donner un peu plus performant méthode de comptage:
n=None, m=None, k=None, p=None, bits=None
utilisé pour?En réaction à Parand, en disant: "pratique courante semble être en utilisant quelque chose comme SHA1 et diviser les bits à former de multiples hachages", tout cela peut être vrai dans le sens que c'est une pratique courante (PyBloom l'utilise aussi), cela ne signifie pas que c'est la bonne chose à faire 😉
Pour une Floraison de filtre, à la seule condition d'une fonction de hachage a, c'est que son espace de sortie doit être distribué uniformément compte tenu de la contribution qui est attendue. Tout un hachage cryptographique certainement répond à cette exigence, c'est aussi un peu comme tirer sur une mouche avec un bazooka.
Au lieu d'essayer de la FNV de Hachage qui utilise seulement un ou exclusif (XOR) et une multiplication par d'octets d'entrée, qui, je l'estimation est une centaine de fois plus rapide que SHA1 🙂
La FNV de hachage n'est pas cryptographique sécurisé, mais vous n'avez pas besoin de l'être. Il a légèrement imparfait avalanche de comportement, mais vous ne l'utilisez pas pour la vérification de l'intégrité soit.
Au sujet de l'uniformité, notez que le deuxième lien seulement fait un test du Chi carré pour les 32 bits de la FNV de hachage. Il est préférable d'utiliser plus de bits et de la FNV-1 variante, qui échange le XOR et la MUL étapes pour mieux peu de dispersion. Pour une Floraison de Filtre, il y a un peu plus de prises, telles que la cartographie de la sortie uniformément à l'indice de gamme de la bit-tableau. Si possible, je dirais rond de la taille de la bit-tableau à la prise électrique la plus proche de 2 et ajuster k en conséquence. De cette façon, vous obtenez une meilleure précision et vous pouvez utiliser simple XOR-pliage de la carte de la gamme.
En outre, voici une référence expliquant pourquoi vous ne voulez pas SHA1 (ou tout de hachage cryptographique) lorsque vous avez besoin un objectif général de hachage.
Finalement, j'ai trouvé pybloomfiltermap. Je ne l'ai pas utilisé, mais il semble qu'il faudrait adapter le projet de loi.
Regarder la tableau module.
FWIW, tous les
//8
et% 8
opérations peuvent être remplacés par des>>3
et&0x07
. Cette peut conduire à un peu mieux de la vitesse au risque d'une certaine obscurité.Aussi, la modification de
'B'
et8
à'L'
et32
devrait être plus rapide sur la plupart des matériels. [Modification'H'
et 16 pourrait être plus rapide sur certains matériels, mais il est douteux.]J'ai mis en place un python bloom filtre de mise en œuvre au http://stromberg.dnsalias.org/~strombrg/drs-bloom-filtre/
C'est dans le plus pur python, a de bonnes fonctions de hachage, de bons tests automatisés, une sélection de backends (disque, tableau, mmap, de plus en plus) et plus intuitive des arguments à l'
__init__
méthode, de sorte que vous pouvez spécifier un nombre idéal d'éléments et maximale souhaitée pour le taux d'erreur, au lieu de un peu éthérée, discbased spécifique de paramètres.C'est depuis près d'une décennie la plus récente des réponses ici. Et les temps changent.
Ressemble le plus populaire maintenu bloom filtre de paquet à la fin de 2019 est maintenant celui-ci: https://github.com/joseph-fox/python-bloomfilter, disponible sur PyPi comme pybloom_live: https://pypi.org/project/pybloom_live/