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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月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个亿,因此我们的内存是够用的。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
3月前
|
人工智能 边缘计算 自然语言处理
普通电脑也能跑AI:10个8GB内存的小型本地LLM模型推荐
随着模型量化技术的发展,大语言模型(LLM)如今可在低配置设备上高效运行。本文介绍本地部署LLM的核心技术、主流工具及十大轻量级模型,探讨如何在8GB内存环境下实现高性能AI推理,涵盖数据隐私、成本控制与部署灵活性等优势。
1438 0
普通电脑也能跑AI:10个8GB内存的小型本地LLM模型推荐
|
4月前
|
数据采集 编解码 人工智能
Gemma 3n正式版开源:谷歌全新端侧多模态大模型,2GB 内存就能跑,重点提升编码和推理能力!
6月底,Google正式开源发布了全新端侧多模态大模型 Gemma 3n!相较此前的预览版,最新的 Gemma 3n 完整版进一步提升性能表现,支持在 2GB 内存的硬件上本地运行,重点提升了编码和推理方面的能力。
550 1
|
3月前
|
编解码 Ubuntu Linux
ubuntu系统安装指南:免费且适合老旧电脑,4GB内存也能流畅运行!
点击启动台,找到并点击设置。在设置中,选择语言和区域,再点击管理语言。安装所需的语言包,输入密码进行确认。等待大约2分钟,语言包安装完成后,点击安装语言,选择中文选项。这里有简体和繁体两种选择,根据个人需求进行选择。再次等待2分钟,安装完成后,点击这里,选择中文并应用。然后,将出现的中文拖动到最上面,应用更改并退出设置。最后,重启虚拟机,再次进入系统时,你会发现界面已经变成了中文,而且系统依然保持流畅。Ubuntu系统不仅外观漂亮、干净,而且性能稳定、安全可靠。如果你的电脑内存只有4GB,或者你对Windows系统感到厌倦,那么Ubuntu绝对是一个值得尝试的选择。它不仅办公打印一应俱全,还拥
|
8月前
|
负载均衡 算法 应用服务中间件
Nginx长连接负载均衡详细说明以及案例
本文详细介绍了Nginx长连接负载均衡的配置与原理。长连接(Keepalive)允许客户端和服务器保持连接,减少建立和关闭连接的开销。Nginx支持多种负载均衡算法,如轮询、IP哈希等。通过在Nginx配置文件中使用`upstream`模块和`keepalive`指令,可以实现长连接负载均衡,从而提高系统的性能和响应速度。示例配置展示了如何设置后端服务器组、长连接数及HTTP/1.1协议,确保连接复用,降低延迟。
470 5
|
8月前
|
存储 大数据 BI
场景题:有40亿个QQ号如何去重?仅1GB内存
在处理大数据去重问题时,如40亿QQ号的去重(仅1GB内存),可采用Bitmap和布隆过滤器两种方法。Bitmap利用位图存储,每个QQ号占1位,总需512MB内存,适用于整型数据;布隆过滤器通过多个哈希函数计算下标,适合字符串或对象去重,但存在误判率。在线人员统计等场景也可使用类似思路,将ID作为偏移值标记在线状态或视频存在性。
265 5
|
11月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
1030 7
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
259 14
|
12月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
205 5
|
12月前
|
存储 监控 Java
处理40亿个QQ号的挑战:如何在1GB内存中实现高效管理
在大数据时代,如何高效管理和处理海量数据是每个开发者和数据工程师面临的挑战。以40亿个QQ号为例,如何在仅有1GB内存的条件下完成数据的存储、查询和处理,成为了一个值得深入探讨的问题。本文将分享一些有效的策略和技术,帮助你在内存受限的情况下高效处理海量数据。
197 3
|
12月前
|
存储 分布式计算 算法
1GB内存挑战:高效处理40亿QQ号的策略
在面对如何处理40亿个QQ号仅用1GB内存的难题时,我们需要采用一些高效的数据结构和算法来优化内存使用。这个问题涉及到数据存储、查询和处理等多个方面,本文将分享一些实用的技术策略,帮助你在有限的内存资源下处理大规模数据集。
161 1

热门文章

最新文章

相关实验场景

更多