


Comment utiliser Bloomfilter de Redis pour supprimer les doublons pendant le processus du robot d'exploration
Le contenu de cet article explique comment utiliser Bloomfilter de Redis pour supprimer les doublons. Il utilise non seulement les capacités de suppression massive de doublons de Bloomfilter, mais utilise également les capacités de persistance de Redis. Il a une certaine valeur de référence. J'espère que cela vous sera utile.
Avant-propos :
Le « retrait » est une compétence souvent utilisée dans le travail quotidien, notamment dans le domaine des robots, et est d'envergure moyenne. Tous sont relativement grand. Deux points doivent être pris en compte pour la déduplication : la quantité de données à dédupliquer et la vitesse de déduplication. Afin de maintenir une vitesse de déduplication rapide, la déduplication est généralement effectuée en mémoire.
Lorsque la quantité de données n'est pas importante, elles peuvent être directement placées dans la mémoire pour la déduplication. Par exemple, python peut utiliser set() pour la déduplication.
Lorsque les données de déduplication doivent être conservées, la structure de données définie de Redis peut être utilisée.
Lorsque la quantité de données est plus importante, vous pouvez utiliser différents algorithmes de cryptage pour compresser la longue chaîne en 16/32/40 caractères, puis utiliser les deux méthodes ci-dessus pour supprimer les doublons ;
Lorsque la quantité de données atteint l'ordre de centaines de millions (voire de milliards ou de dizaines de milliards), la mémoire est limitée, et des "bits" doivent être utilisés pour dédupliquer les données afin répondre à la demande. Bloomfilter mappe les objets de déduplication sur plusieurs « bits » de mémoire et utilise les valeurs 0/1 de plusieurs bits pour déterminer si un objet existe déjà.
Cependant, Bloomfilter fonctionne sur la mémoire d'une machine, ce qui n'est pas pratique pour la persistance (il n'y aura rien si la machine est en panne), et ce n'est pas pratique pour une déduplication unifiée de robots d'exploration distribués. Si vous pouvez demander de la mémoire sur Redis pour Bloomfilter, les deux problèmes ci-dessus seront résolus.
Code :
# encoding=utf-8import redisfrom hashlib import md5class SimpleHash(object): def __init__(self, cap, seed): self.cap = cap self.seed = seed def hash(self, value): ret = 0 for i in range(len(value)): ret += self.seed * ret + ord(value[i]) return (self.cap - 1) & retclass BloomFilter(object): def __init__(self, host='localhost', port=6379, db=0, blockNum=1, key='bloomfilter'): """ :param host: the host of Redis :param port: the port of Redis :param db: witch db in Redis :param blockNum: one blockNum for about 90,000,000; if you have more strings for filtering, increase it. :param key: the key's name in Redis """ self.server = redis.Redis(host=host, port=port, db=db) self.bit_size = 1 << 31 # Redis的String类型最大容量为512M,现使用256M self.seeds = [5, 7, 11, 13, 31, 37, 61] self.key = key self.blockNum = blockNum self.hashfunc = [] for seed in self.seeds: self.hashfunc.append(SimpleHash(self.bit_size, seed)) def isContains(self, str_input): if not str_input: return False m5 = md5() m5.update(str_input) str_input = m5.hexdigest() ret = True name = self.key + str(int(str_input[0:2], 16) % self.blockNum) for f in self.hashfunc: loc = f.hash(str_input) ret = ret & self.server.getbit(name, loc) return ret def insert(self, str_input): m5 = md5() m5.update(str_input) str_input = m5.hexdigest() name = self.key + str(int(str_input[0:2], 16) % self.blockNum) for f in self.hashfunc: loc = f.hash(str_input) self.server.setbit(name, loc, 1)if __name__ == '__main__':""" 第一次运行时会显示 not exists!,之后再运行会显示 exists! """ bf = BloomFilter() if bf.isContains('http://www.baidu.com'): # 判断字符串是否存在 print 'exists!' else: print 'not exists!' bf.insert('http://www.baidu.com')
Description :
Bloomfilter Il existe de nombreuses explications sur Baidu sur la façon dont l'algorithme utilise la déduplication de bits. Pour faire simple, il y a plusieurs graines. Maintenant, demandez une section d'espace mémoire. Une graine peut être hachée avec une chaîne et mappée sur un bit de cette mémoire. Si plusieurs bits sont à 1, cela signifie que la chaîne existe déjà. Lors de l'insertion, les bits mappés sont mis à 1.
Il convient de rappeler que l'algorithme Bloomfilter a une probabilité manquante, c'est-à-dire qu'il existe une certaine probabilité qu'une chaîne inexistante soit jugée à tort comme étant déjà existante. La taille de cette probabilité est liée au nombre de valeurs de départ, à la taille de mémoire demandée et au nombre d'objets de déduplication. Il y a un tableau ci-dessous, m représente la taille de la mémoire (combien de bits), n représente le nombre d'objets de déduplication et k représente le nombre de valeurs de départ. Par exemple, j'ai demandé 256 M dans mon code, soit 1
La déduplication Bloomfilter basée sur Redis utilise en fait la structure de données String de Redis, mais une chaîne Redis ne peut avoir qu'un maximum de 512 Mo, donc si les données de déduplication le volume est important et vous devez demander plusieurs blocs de déduplication (blockNum dans le code représente le nombre de blocs de déduplication).
Le code utilise le cryptage et la compression MD5 pour compresser la chaîne à 32 caractères (hashlib.sha1() peut également être utilisé pour la compresser à 40 caractères). Il a deux fonctions : premièrement, Bloomfilter fera des erreurs lors du hachage d'une chaîne très longue, la jugeant souvent à tort comme étant déjà existante. Ce problème n'existe plus après la compression ; deuxièmement, les caractères compressés sont 0~f au total. J'ai intercepté les deux premiers caractères, puis attribué la chaîne à différents blocs de déduplication en fonction de blockNum pour la déduplication.
Résumé :
La déduplication Bloomfilter basée sur Redis utilise à la fois les capacités de déduplication massive de Bloomfilter et la capacité de persistance de Redis, basée sur Redis, facilite également la déduplication des fichiers. machines distribuées. Lors de l'utilisation, il est nécessaire de budgétiser la quantité de données à dédupliquer et d'ajuster de manière appropriée le nombre de seed et blockNum selon le tableau ci-dessus (moins il y a de seed, plus la déduplication sera rapide, mais plus le taux de fuite est élevé).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Liaison statique (statique: :) implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.
