负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数

基于python实现。

如果是常规的小型文件,我们可以迅速地想到要建立字典。

以数字为key,以数字的出现次数为value,建立<int,int>类型的键值对存入字典,然后使用 max 函数结合字典的 items 方法来找到一个字典中 value 最大的 key即可。

在计算机底层中,<int, int>类型的键值对所占的大小为8个字节,20亿个整数极端情况下如果产生了20亿个键值对那么仅仅是存储就需要16GB的内存,更别论python中数据类型还封装了更多属性和方法,以及后续操作、计算机的其他程序操作也同样需要资源了。

基于抽象和拆分的编程思想,我们可以进行将操作步骤进行如下划分:

1、创建合理数量的小文件。

2、将20亿个数据分配进入小文件中,需要注意:相同的整数要在同一个文件中,并且文件大小尽量均匀。

3、计算每个文件中出现次数最多的整数,最后对比得出结果。

在一步步进行具体操作之前,我们先模拟创建出有20亿个整数(约16GB)的文件,并且存入硬盘。

其次,我们需要确认创建多少个小文件。

20亿的数据极端情况下至少需要16GB的内存,如果平均拆成10个小文件,每个小文件约有2亿数据,键值对存储约需要1.6GB内存,正好满足不高于2GB的内存要求。为了保险可以多拆几个文件。如果凭借经验知道这20亿个数据中有较为不均匀的数据分布,也可根据经验进行数量拓展。因为我产生的数据比较了解,因此我就选择拆出10个小文件。

接着,我们需要将20亿个数据分入10个文件中,并且相同的整数要在同一个文件。

这里介绍一下哈希算法,哈希算法的具体定义可以上网查询。简单来说可以把哈希算法比作一个编号工具,我们给哈希算法一个数据,无论是什么类型的皆可,它经过一系列复杂的数学运算,就会给这个数据一个编号,这个编号是一般是一个长长的整数,通常情况下编号会和数据对应,如果是相同的数据那么得到的编号是完全一致的。如果我们给这个哈希算法喂了大量的数据,那么它就会吐出很多对应的编号,这些编号具有强随机分布的特征,也就是在哈希值的范围内分布很均匀。

我们把20亿个数据通通喂入哈希算法,再把这些编号对10取余进行散列,20亿个数据就被分入了10个文件中,以此可以完成把相同的数据分入同一个文件。说起来抽象其实写起来很简单,各位看看代码就明白了。

有些同学可能就问了,为什么要先哈希再取余呢?直接取余不行吗?用哈希算法是为了解决2方面的问题,一方面是我们实务中接触的数据有可能不是整数,另一方面是如果直接取余然后分配可能会导致文件之间大小不均衡,而哈希函数产生的编号分布是十分均匀的,取余之后,余数的分布也会很均匀,因此根据余数把整数分配进入文件的数据也会很均匀。

最后计算每个文件中出现次数最多的整数,再进行对比就可以得到结果了。根据上述的哈希算法的特征,每个文件的不同的整数不会超过2个亿,因此我们的内存是够用的。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
6月前
|
存储
数据在内存中的存储之整数存储
数据在内存中的存储之整数存储
49 0
|
14天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
2月前
|
NoSQL 程序员 Linux
轻踩一下就崩溃吗——踩内存案例分析
踩内存问题分析成本较高,尤其是低概率问题困难更大。本文详细分析并还原了两个由于动态库全局符号介入机制(it's a feature, not a bug)触发的踩内存案例。
|
3月前
|
存储 算法 大数据
小米教你:2GB内存搞定20亿数据的高效算法
你好,我是小米。本文介绍如何在2GB内存中找出20亿个整数里出现次数最多的数。通过将数据用哈希函数分至16个小文件,每份独立计数后选出频次最高的数,最终比对得出结果。这种方法有效解决大数据下的内存限制问题,并可应用于更广泛的场景。欢迎关注我的公众号“软件求生”,获取更多技术分享!
173 12
|
4月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
4月前
|
Java Perl
JVM内存问题之如何统计在JVM的类加载中,每一个类的实例数量,并按照数量降序排列
JVM内存问题之如何统计在JVM的类加载中,每一个类的实例数量,并按照数量降序排列
|
5月前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
|
5月前
|
存储 C语言
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
|
6月前
|
Java
堆内存的溢出案例分析
堆内存的溢出案例分析
25 0
|
6月前
|
数据处理 开发者 Python
python 代码内存统计
【4月更文挑战第9天】