哈希处理海量数据

接下来我们将以问题的形式来介绍如何用hash处理海量数据。

1.问题1 (位图)

给定100亿个整数,设计算法找到只出现一次的。

1.1问题分析

100亿个整数,一个整数占用4byte,那么就需要约40G左右的空间来存储。显然常见的map等数据结构无法在运行内存中进行处理。我们会想到之前学的位图,其是用一个bite位来标记数字的两种状态(0表示不存在,1表示存在),但此题中的每个整数可以看成三种状态(00表示不存在,01表示出现一次,10表示出现两次)。

1.2问题解答

方案一:

在位图的基础上,我们利用其原理,对位图的进行改造。我们不再用一个bite位映射一个整数,而是用两个bite位映射一个整数。

 方案二:

既然每个数字要两个bite位存储,那么我们可以用两个位图来存储每个数字的信息,bm1存储第一个bite位,bm2存储第二个bite位

2.问题2(位图)

两个文件,各有100亿个整数,我们只有1G的内存,如何找到这两个文件的交集

2.1问题分析

海量数据处理,显然普通的数据结构无法解决,我们考虑用位图来解决问题。一个能代表整形的位图有0.5G的大小 

2.2问题解答

方案1:

我们可以利用一个位图来存储文件1的信息,再读取文件2的整数依次在位图中test即可解决问题。

方案2:

我们可以利用位图1来存储文件1的信息,位图2来存储文件2的信息。再将两个位图的bite位按位与,得到的新位图即为交集部分。

3.问题3(布隆过滤器and哈希分割)

两个文件,分别有100亿个query,我们有1G的内存,如何找到两个文件的交集?分别给出精确算法和近似算法

3.1问题分析

一个query我们可以将其看为字符串,大概有30个字节大小,那么100亿个query就是300-600G的大小,显然常规的数据结构无法解决。我们考虑用bloom_filter来解决近视算法。

3.2问题解决

方案1:近似算法

我们用一个布隆过滤器来存储文件1的信息,再将文件2的信息依次在布隆过滤器中test,如果每个hash都test成功,那么就可能是交集(也有可能误判,将不是交集的判断为交集)。

方案2:准确算法

显然准确算法不能使用bloom_filter,但是这么多数据无法一一放进内存中,我们思考可否将文件切分为小的文件,再放入内存中呢?

上述的算法就是先将A文件均分为小文件,将B文件也均分为小文件,让在内存中用set进行处理。例如A0,先将A0存储到set中,再B0,B1,B2 ...B999中的数据依次在set中查找;接着A1-B0,B1,B2...B999。显然效率实在是太低了。

那如果我们不均分呢?用hash切割呢?

如图,我们在前期切割的时候,不采用均分切割,采用hash切割:依次取出文件中的字符串,利用字符哈希函数,得到hash值%文件个数,得到的结果就是这个数据一个要进的小文件编号。这样就保证了相同的字符串会进入相同的文件中,这样我们只需要将A0与B0在内存中用set处理,A1与B1.... 

4.问题4(哈希分割)

给一个超过100G的文件,里面存储着ip地址,设计算法找到出现次数最多的ip地址,或者出现次数为top k的地址?

4.1问题分析

处理数据是string,精确查找要求不能使用bloom过滤器,那么我们思考采用划分小文件的方法。

4.2问题解决

我们可以创建1000个小文件,依次编号A0-A999.采用Hash分割,将相同的ip分到同一个文件中。在内存中我们利用map,统计A0文件中的各个ip出现的次数,再利用multimap<int,string>统计出现最多的字符串,在创建一个pair<string,int> max,存储这个字符串。再依次A1-A999,每次更新最多字符串即可。

如果是要topk的字符串,那么我们可以建一个小堆进行数据处理。

5.问题5(一致性哈希)

微信号-朋友圈问题

我们可以近似的将微信号和朋友圈看为kv模型。那么这些数据如何存储呢?

如果10亿用户,每个用户分100M的空间,那么我们需要10万T的空间,假设我们有10万台主机,每台机器能存储1T的信息。

分析:当用户claus发朋友圈时,那么我们应该插入哪台机器呢?显然我们可以采用哈希的思路找到微信号和服务器的映射关系,将朋友圈信息插入到对应服务器中。

那么当我们 扩容服务器时,将10w台服务器扩大为15w台服务器时,数据如何迁移呢?难道要将所有数据重新映射码?显然上面的模型存在缺陷。我们引入一致性hash的概念。

一致性hash时,上图中的应该是x%2^32,这样x会落在0-2^32-1的范围内,我们不再将x与服务器一一对应,而是范围对应,例如将0-10000的值映射到服务器1号,10001的值映射到服务器2号....。

当我们需要扩容时,只需要选择一段高负载范围区,将其分一份范围出来,将数据迁移到新服务器上,修改范围映射范围即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

锐捷Web认证

文章目录 Web认证二代 Web 认证配置 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Datacom专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月6日11点40分 Web认证 Portal 认证、Web认证 Web认证的介绍 Web 认证使用浏览器进行身份验…

深入剖析 Profinet 转 EtherCAT 网关模块的配置流程

有一个工厂需要将西门子S7-1200 PLC与伺服驱动进行通讯&#xff0c;因PLC支持PROFINET而伺服驱动需EtherCAT协议&#xff0c;无法直接通讯。采用捷米特&#xff08;JM-ECTM-PN&#xff09;智能的Profinet转EtherCAT网关模块解决此问题&#xff0c;需导入GSD文件、设定IP和设备名…

【C++习题】17.栈的弹出压入序列

题目&#xff1a; 链接&#x1f517;&#xff1a;栈的弹出压入序列 题目&#xff1a; 代码&#xff1a; class Solution { public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {//入栈和出栈的元素个数必须相同if(pushV.size() ! popV.size())return …

【计算机网络】VLAN及IPVLAN技术解析

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了学习VLAN相关知识的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于 使用VMware组建VLAN网络实验环境 进行的&#xff0c;每个…

【Java】—— 继承

1.继承 1.1 为什么需要继承 在使用类的时候&#xff0c;是将生活中的实物&#xff0c;抽象到代码中进行表示&#xff0c;在生活中&#xff0c;很多实物都是存在关联的&#xff0c;例如 哈士奇、中华田园犬、萨摩耶 都是狗&#xff0c;他们有共性信息&#xff0c;也有属于自己…

2024-12-06 Unity Addressables3——资源加载

文章目录 1 引用加载1.1 Addressables 的资源引用类1.2 加载资源1.3 加载场景1.4 释放资源 2 Label 介绍3 动态加载3.1 加载单个资源3.2 加载多个资源 Unity 版本&#xff1a;6000.0.26f1c1Addressables 版本&#xff1a;2.3.1 1 引用加载 1.1 Addressables 的资源引用类 Ass…

【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容

目录 1. Introduction&#xff1a;介绍 Registry 的作用和功能。2. Registry Contents&#xff1a;详细描述 Registry 的结构和内容&#xff0c;包括各个部分的条目类型。2.1. DIMSPEC ENTRIES&#xff08;维度规格条目&#xff09;2.2. STATE ENTRIES&#xff08;状态变量条目…

在阿里云/Linux环境搭建Gitblit服务

在阿里云/Linux环境搭建Gitblit服务 1. 整体描述2. 前期准备3. 安装步骤3.1 下载gitblit3.2 上传gitblit3.3 解压文件3.4 修改文件配置3.5 启动gitblit3.6 安全组配置 4. 总结 1. 整体描述 前段时间买了一个阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽的配置&#x…

鸿蒙arkts怎么打印一个方法的调用堆栈

做鸿蒙开发的时候&#xff0c;也想看一下一个方法到底是哪里调用的&#xff0c;工程太大&#xff0c;断点太麻烦&#xff0c;可以加堆栈日志。 在你的方法中加上这两句&#xff0c;就可以跟到堆栈日志 let err new Error() console.log(>>>>>>err.stack) …

116. UE5 GAS RPG 实现击杀掉落战利品功能

这一篇&#xff0c;我们实现敌人被击败后&#xff0c;掉落战利品的功能。首先&#xff0c;我们将创建一个新的结构体&#xff0c;用于定义掉落体的内容&#xff0c;方便我们设置掉落物。然后&#xff0c;我们实现敌人死亡时的掉落函数&#xff0c;并在蓝图里实现对应的逻辑&…

亚马逊云服务器Amazon EC2

一、什么是Amazon EC2&#xff1f; Amazon Elastic Compute Cloud (Amazon EC2) 在 Amazon Web Services (AWS) 云中提供按需、可扩展的计算容量。使用 Amazon EC2 可降低硬件成本&#xff0c;让您能够更快地开发和部署应用程序。您可以使用 Amazon EC2 启动任意数量的虚拟服务…

Word 右键内容不显示段落/字体问题解决

有时需要调整图片的行间距&#xff0c;但是右键图片所在行&#xff0c;没有段落的选项。 可以将焦点保持在图片所在行&#xff0c;然后点击右下角的图标。同理不显示字体也可以点击左边字体中的右下角图标。

学生公寓智能限电系统的功能和作用

学生公寓智能限电系统‌是一种用于管理和限制学生公寓用电的设备和技术&#xff0c;旨在确保用电安全、防止火灾事故&#xff0c;并促进节能减排。以下是关于学生公寓智能限电系统的详细介绍&#xff1a; 1、功能和作用 智能限电系统通过以下功能来管理和限制用电&#xff1a…

[IT项管理(双语)]项目的基本概念

什么是项目 1.1项目的定义 项目&#xff08;project&#xff09;是为了创造一个特定的产品&#xff0c;服务&#xff0c;或者成果而采用的临时性的努力。 项目 产出唯一 临时性 1.2运营的定义 运营&#xff08;operation&#xff09;是 为了维持业务而进行的工作。 Imp1.3运…

ASP.NET Core SignalR 双工通信

01. 介绍 &#x1f3af; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;它简化了向应用添加实时 Web 功能的过程。 实时 Web 功能使服务器端代码可以在服务器上激发事件时将事件推送到连接的客户端。 使用 SignalR&#xff0c;客户端也可以将消息发送到服务器&#xff…

Sonar基于SonarQube统一产品命名,助力提升开发者体验,以及本地、云端或IDE端的代码质量与安全

日前&#xff0c;领先的代码质量和安全解决方案提供商Sonar宣布&#xff0c;将围绕SonarQube简化其现有的产品命名。 作为Sonar的旗舰品牌&#xff0c;SonarQube代表了公司的核心使命&#xff1a;提高所有代码的质量和安全性&#xff0c;同时提供更好的开发人员体验。这些变化…

搭建高可用负载均衡系统:Nginx 与云服务的最佳实践

搭建高可用负载均衡系统&#xff1a;Nginx 与云服务的最佳实践 引言 在项目开发过程中&#xff0c;我们通常在开发和测试阶段采用单机架构进行开发和测试。这是因为在这个阶段&#xff0c;系统的主要目的是功能实现和验证&#xff0c;单机架构足以满足开发人员的日常需求&…

芯科科技突破性超低功耗Wi-Fi 6和低功耗蓝牙5.4模块加速设备部署

致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;今日宣布推出SiWx917Y超低功耗Wi-Fi 6和低功耗蓝牙&#xff08;Bluetooth LE&#xff09;5.4模块。 作为成功的第二代无线开发平台的新产品&…

CentOS7虚拟机 网络适配器 NAT模式和桥接模式区别

一、环境介绍 宿主机&#xff1a;Windows电脑 虚拟机&#xff1a;VMware下的CentOS7 局域网&#xff1a;路由器下的各真实主机组成的网络 内部局域网&#xff1a;宿主机构建的一个内部网路 二、NAT和桥接网络链接模式区别 NAT模式&#xff1a;相当于宿主机构建一个内部局域网&a…

【AIGC半月报】AIGC大模型启元:2024.12(上)

【AIGC半月报】AIGC大模型启元&#xff1a;2024.12&#xff08;上&#xff09; &#xff08;1&#xff09;OpenAI-12日发布会&#xff08;持续更新中........&#xff09;Day01-12.06&#xff1a;o1满血版上线&#xff08;已发布&#xff09;Day02-12.07&#xff1a;强化微调&a…