python 布隆过滤器 优化内存

news/2025/1/6 19:51:47/文章来源:https://www.cnblogs.com/xuchunlin/p/18652885
import mmh3
import redis
import mathclass PyBloomFilter:# 内置100个随机种子SEEDS = [543, 460, 171, 876, 796, 607, 650, 81, 837, 545, 591, 946, 846, 521, 913, 636, 878, 735, 414, 372,344, 324, 223, 180, 327, 891, 798, 933, 493, 293, 836, 10, 6, 544, 924, 849, 438, 41, 862, 648, 338,465, 562, 693, 979, 52, 763, 103, 387, 374, 349, 94, 384, 680, 574, 480, 307, 580, 71, 535, 300, 53,481, 519, 644, 219, 686, 236, 424, 326, 244, 212, 909, 202, 951, 56, 812, 901, 926, 250, 507, 739, 371,63, 584, 154, 7, 284, 617, 332, 472, 140, 605, 262, 355, 526, 647, 923, 199, 518]def __init__(self, capacity=2000000000, error_rate=0.00000001, conn=None, key='BloomFilter'):"""
        初始化布隆过滤器。:param capacity: 预先估计要去重的数量。:param error_rate: 错误率。:param conn: Redis 的连接客户端。:param key: 在 Redis 中键的名字前缀。"""
        self.m = math.ceil(capacity * math.log2(math.e) * math.log2(1 / error_rate))  # 需要的总 bit 数self.k = 1  # 需要最少的 hash 次数self.mem = math.ceil(self.m / 8 / 1024 / 1024)  # 需要的多少 M 内存self.block_size_gb = 10  # 每个内存块的大小(GB)self.block_size_bits = self.block_size_gb * 1024 * 1024 * 8  # 每个内存块的大小(bits)self.blocknum = min(math.ceil(self.mem / self.block_size_gb), 256)  # 需要多少个 10GB 的内存块self.seeds = self.SEEDS[:self.k]  # 只需要一个种子用于单哈希self.key = keyself.N = 2 ** 31 - 1self.redis = connprint("self.m", self.m)print("self.k", self.k)print("self.mem", self.mem)print("self.block_size_bits", self.block_size_bits)print("self.blocknum", self.blocknum)print("self.seeds", self.seeds)def add(self, value):"""
        将元素添加到布隆过滤器中。:param value: 要添加的元素。"""
        # 计算 Redis 键名name = f"{self.key}_{ord(value[0]) % self.blocknum}"# 获取哈希值列表hashs = self.get_hashes(value)# 设置每个哈希位置的位为 1for hash in hashs:block_index = hash // self.block_size_bitsbit_offset = hash % self.block_size_bitsblock_name = f"{name}_{block_index}"self.redis.setbit(block_name, bit_offset, 1)def is_exist(self, value):"""
        检查元素是否存在于布隆过滤器中。:param value: 要检查的元素。:return: 如果存在返回 True,否则返回 False。"""
        # 计算 Redis 键名name = f"{self.key}_{ord(value[0]) % self.blocknum}"# 获取哈希值列表hashs = self.get_hashes(value)exist = True# 检查每个哈希位置的位是否为 1for hash in hashs:block_index = hash // self.block_size_bitsbit_offset = hash % self.block_size_bitsblock_name = f"{name}_{block_index}"exist = exist and bool(self.redis.getbit(block_name, bit_offset))return existdef get_hashes(self, value):"""
        获取元素的哈希值列表。:param value: 要哈希的元素。:return: 哈希值列表。"""
        hashs = list()for seed in self.seeds:hash_value = mmh3.hash(value, seed)if hash_value >= 0:hashs.append(hash_value)else:hashs.append(self.N - hash_value)return hashs# 创建 Redis 连接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=8)
# 创建 Redis 客户端
conn = redis.Redis(connection_pool=pool)
# 创建布隆过滤器实例
bf = PyBloomFilter(conn=conn)# 测试添加元素和检查元素是否存在
bf.add("example")
print(bf.is_exist("example"))  # 存在    输出应为 True
print(bf.is_exist("test"))     # 不存在  输出应为 False

去重方式有那些
1. 数据库 唯一索引

  比如MySQL,es等
2. redis set


3. 布隆过滤器

4.  时间 + redis set

5. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864113.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态工作点对波形失真的影响

一、截止失真原因:当静态工作点设置过低,即\(I_{BQ}\)过小,\(V_{CEQ}\)过大时,输入信号的负半周可能会使晶体管进入截止区。 现象:输出波形的正半周被削顶,即正半周顶部被“切掉”一部分,这是因为在截止区,晶体管的集电极电流\(i_C\)几乎为零,不能跟随输入信号的变化而…

基本共射极放大电路

以下是关于基本共射极放大电路的详细介绍: 电路结构由晶体管(通常是BJT)、直流电源\(V_{CC}\)、基极偏置电阻\(R_b\)、集电极负载电阻\(R_c\)、输入电容\(C_1\)、输出电容\(C_2\)以及输入信号源\(v_s\)和负载电阻\(R_L\)组成。工作原理直流偏置:通过\(R_b\)和\(V_{CC}\)为晶…

20241322 《计算机基础与程序设计》课程总结

2024-2025-1 20241322 《计算机基础与程序设计》第十五周学习总结 作业信息 |这个作业属于哪个课程|https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP| |这个作业要求在哪里|https://www.cnblogs.com/rocedu/p/9577842.html#WEEK15| |这个作业的目标|课程总结,文中的链…

《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例

《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例@目录7.Docker容器数据卷7.1坑7.2 回顾下上一讲的知识点,参数V7.3 是什么7.4 能干嘛7.5 数据卷案例7.5.1 宿主vs容器之间映射添加容器卷7.5.2 读写规则映射添加说明7.5.…

DIY笔记本散热器

前言我用的笔记本是R9000P 2021H,用了快三年才发现笔记本发热量有点高,GPU 3070倒是还好不用担心过热的问题,主要是这个CPU 5800H非常积热。最近也是清完灰、涂硅脂、换完风扇了,双烤测试了下功耗能到200W但是CPU有大概70C往上的样子,考虑到这是冬季测试下的结果,这个成绩…

BJT的共射极伏安特性曲线

BJT(双极型晶体管)共射极的伏安特性曲线包括输入特性曲线和输出特性曲线,以下是详细讲解:输入特性曲线定义:描述基极电流\(i_B\)与基极-发射极电压\(v_{BE}\)之间的关系,通常以集电极-发射极电压\(v_{CE}\)为参变量,即\(i_B = f(v_{BE})|_{v_{CE}=constant}\)。 曲线形状…

检索增强生成和思维链结合: 如何创建检索增强思维链 (RAT)?

论文地址:https://arxiv.org/pdf/2403.05313 Github地址:https://github.com/CraftJarvis/RAT 想象一下,一个人工智能助手可以像莎士比亚一样写作,像专家一样推理。这听起来很了不起,对吧?但是,如果这个助手有时难以确保事实准确性,依赖过时的信息或只是编造事实,该怎…

163MusicLyrics(歌词下载工具) v6.3

一款Windows 云音乐歌词获取,支持网易云、QQ音乐。 软件特点 支持网易云、QQ音乐两家音乐提供商 支持输入歌曲 ID、输入专辑 ID、完整链接的方式进行查询 支持批量查询 && 扫盘查询 支持多种歌词原文和译文的组织方式 支持提取(部分)歌曲试听链接 支持多种保存命名规…

维度情感模型

一.维度情感模型 人类的情感是复杂繁琐的认知过程,很难对人类情感进行简单的概括,现阶段的情感模型大多分为两种,分别是离散情感模型和维度情感模型。 传统上,情感被看作是离散的类别,例如快乐、悲伤、愤怒等。离散情感模型将情感分为独立的类别,著名的心理学家Ekman等人…

Android 洛雪音乐 v1.6.0

洛雪音乐电脑版本很出名,手机版本同样是一个作者开发的产品,使用React native开发的安卓版本,软件界面清新,功能强大,该有的功能都有。同时,软件已经开源,允许所有人学习源码。获取地址:https://www.dmjf.top/2542.html

雪藏HsFreezer(游戏冻结工具) v2.09

HsFreezer 是一款让你可以随心冻结游戏的软件(游戏暂停软件、系统优化软件、进程管理软件),想玩就玩,想停就停,快捷键随心瞬发,单锁模式极致的丝滑切换,当然,不止适用游戏。更有丰富的特色系统优化功能。 PC主机,win掌机,笔记本–无脑装就对了,超大按键超大列表,触控盲操,非常巴…