海量数据有限内存系列问题解决方案
1. 排序问题
有限数据充足内存:内存中有十万整数,对所有数据进行排序。
内部排序即可
单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿整数,一个整数一行,可用内存1G,对所有数据进行排序。
60 * 10 ^ 8 * 4 byte 约为 22.35 gb
,无法直接加载至内存进行内部排序,需要采用外部排序方式。
- 读取该文件,每读取64MB数据就进行一次内部排序(如快排),然后将有序的64MB数据写入一个新的文件,依次类推,到最后会获得n个有序片段,其中前n-1个为64M数据,最后一个有可能不够64MB。
- 对上面的n个有序片段采用归并排序的思路进行归并,同时打开k个有序片段,分别从k个归并片段各读取一个整数,从中选择最小的整数,写入一个新文件,假设是第1个有序片段的整数被写入新文件,则该片段读取下一个整数,其他片段不读新的整数,再次比较获取新一个最小的整数,直到新文件写入128M大小后完成一个文件,然后新开一个文件,如果某个有序片段被读完了,那么读新的有序片段即可。
- 重复以上步骤直到归并为一个大文件。
多节点海量数据有限内存:64台机器,每台机器一个文件,文件中包含六十亿整数,一个整数一行,每台机器可用内存1G,对所有数据进行排序。
- 每台机器各自排序,参考上述单节点排序
- 跨节点归并,两两节点归并,2号节点将数据传输给1号节点,1号节点做本地排序,然后1号节点将排序的后半段数据传输给2号节点,以此类推,3号与4号节点等都可以同时操作
- 然后第二趟计算,1号和2号两者有序,3号和4号两者有序,可以以如下流程进行四个节点的排序,3号节点数据传输给1号节点,此时1号节点有两段数据的两个前半部分,基于双指针的思路从两部分数据中不断提取最小的数据到一个新的文件中,若其中一部分数据用完,取对应的后半段,例如,3号节点传输给1号节点的数据用完,就从4号节点传输数据到1号节点,由于现在是4个节点排序,故此时每完成1/4数据排序,要将这部分数据回传到对应节点,例如第一个1/4数据要存储到1号接待你,第二个1/4数据传输到2号节点,直到四个节点数据排序完成。
- 其余合并流程同理,直到分布式集群数据排序完成
2. 中位数问题
有限数据充足内存:内存中有十万整数,获取所有数据的中位数。
排序取中位数即可
单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿整数,一个整数一行,可用内存1G,获取所有数据的中位数。
方案一:外部排序后直接取中位数
方案二:分区,在某一个区中做内部排序然后取中位数
- [0,1000)属于一个区间,[1000, 2000)属于一个区间,依次类推,将所有的数分到每一个区间中,每个区间一个文件
- 由此,根据数据总量以及每一个分区的数据总量,可以定位到中位数所在区间以及中位数在这个区间中的位置(是指该区间排序完成后的位置)
- 对该区间进行排序,直接获取中位数
方案二相比于方案一优化的点在于通过有序的区间减少了排序开销
多节点海量数据有限内存:64台机器,每台机器一个文件,文件中包含六十亿整数,一个整数一行,每台机器可用内存1G,,获取所有数据的中位数。
方案一:分布式排序,直接取中位数
方案二:???
3. Top-K问题
什么是TopK问题
从n个元素中,找到最大的k个元素。
例如,有数组 nums = [5,3,7,1,8,2,9,4,7,2,6,6],找出其中最大的5个数
TopK问题的应用场景
- 搜索引擎:在搜索引擎中,Top-K问题可以用于返回用户查询的前K个最相关的搜索结果。
- 推荐系统:在电子商务网站或媒体流推荐中,可以使用Top-K问题来提供用户最感兴趣的产品或内容。
- 数据分析:在大数据分析中,Top-K问题可用于查找最频繁出现的元素或最高价值的数据点。
- 数据挖掘:在聚类和分类问题中,可以使用Top-K问题来选择具有最高重要性的特征或数据点。
- 排行榜:例如在美团店面排行、软件排行榜、富豪榜等场景中,需要用到Top-K问题来确定排名。
- 数据库查询优化:在数据库查询中,Top-K查询可以用来实现分页展示,例如在购物平台上搜索价格在一定范围内的衣服,系统会从价格最低开始扫描,一旦价格超过范围,查询就会终止。
- 机器学习模型:在处理预测结果时提取最可能的候选项,例如在分类问题中,找出概率最高的几个类别。
- 数据处理:在深度学习和数据处理中,经常需要对数据进行排序并提取最重要的部分,torch.topk函数能够快速找到给定张量中的最大或最小的K个元素。
有限数据充足内存:内存中有十万整数,获取所有数据中最大的一万个数且按照从大到小顺序返回。
方案一:快排后取k个元素
对n个元素从大到小排序,然后取出前k个元素即可
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
方案二:k趟冒泡
基于冒泡思想,从后往前冒泡,每趟冒泡将最大的元素移动到数组前面,k趟冒泡完成topk查找。
时间复杂度: O ( k n ) O(kn) O(kn)
方案三:容量为k的堆
- 先用前k个元素生成一个小顶堆,这个小顶堆用于存储,当前最大的k个元素。
- 接着,从第k+1个元素开始扫描,和堆顶(堆中最小的元素)比较,如果被扫描的元素大于堆顶,则替换堆顶的元素,并调整堆,以保证堆内的k个元素,总是当前最大的k个元素。
- 扫描完所有n-k个元素,最终堆中的k个元素,就是求的TopK。
时间复杂度: O ( n l o g k ) O(nlogk) O(nlogk)
BFPRT
https://zhuanlan.zhihu.com/p/291206708
单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿整数,一个整数一行,可用内存1G,获取所有数据中最大的一万个数且按照从大到小顺序返回。
方案一:排序,取前一万
方案二:遍历一万次文件,每次从中获取当前最大的那个数,取过的数不在计算入内
方案三:开一个容量一万的小根堆,不断从文件中读取元素,若该元素大于小根堆堆顶元素,就替换堆顶元素然后调整堆,直到处理完一遍元素。可以做多线程优化,例如开60个线程,每个线程处理一亿数据,每个线程维护一个容量为一万的堆,主线程负责将60个堆结果做合并,获取前一万。
多节点海量数据有限内存:64台机器,每台机器一个文件,文件中包含六十亿整数,一个整数一行,每台机器可用内存1G,获取所有数据中最大的一万个数且按照从大到小顺序返回。
方案一:分布式排序,取前一万
方案二:单节点开堆或者冒泡获取前一万结果,分布式节点将节点的前一万结果传输到集群中的某一个节点做合并出最终结果。
5. 频率Top-K问题
有限数据充足内存:内存中有十万字符串,每个字符串不超过255字节,获取所有数据中出现次数最多的前一万个字符串且按照出现次数从多到少返回。
哈希表、前缀树,适合有限种类数据
单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿字符串,一个字符串一行,可用内存1G,获取所有数据中出现次数最多的前一万个字符串且按照出现次数从多到少返回。
方案一:对每个字符串求哈希然后根据哈希值切分文件,每个小文件单独求频率,仅返回频率最高的10000个字符串,然后本地每个文件的结果合并获得本机器上的前一万个字符串
方案二:字符串排序,按序统计频率,开容量为10000的堆获取前一万结果。
多节点海量数据有限内存:64台机器,每台机器一个文件,文件中包含六十亿字符串,一个字符串一行,每台机器可用内存1G,获取所有数据中出现次数最多的前一万个字符串且按照出现次数从多到少返回。
方案一:单节点计算结果,多节点传输数据到某一个节点做reduce合并出结果。
6. 数据去重问题
有限数据充足内存:内存中有十万字符串,每个字符串不超过255字节,对所有字符串进行去重,每个重复出现的字符串仅保留一个。
哈希表、前缀树,适合有限种类数据
单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿字符串,一个字符串一行,可用内存1G,对所有字符串进行去重,每个重复出现的字符串仅保留一个。
方案一:求哈希然后切分文件,每个小文件单独求频率,仅返回频率最高的10000个字符串,然后本地每个文件的结果合并获得本机器上的前一万个字符串
多节点海量数据有限内存:64台机器,每台机器一个文件,文件中包含六十亿字符串,一个字符串一行,每台机器可用内存1G,对所有字符串进行去重,每个重复出现的字符串仅保留一个。
方案一:求哈希,根据哈希分组传输数据到指定节点,每个节点去重即可。
7. 数据求交集问题(并集、差集问题类似)
有限数据充足内存:内存中有两个数据块,每个数据块中包含十万整数且每个数据块各自数据无重复,求两个数据块中都有的元素。
集合结构求交集
单节点海量数据有限内存:某台机器有两个文件,每个文件包含六十亿整数且且每个文件中各自数据无重复,求两个文件中都有的元素。
方案一:哈希值切分文件,第一个文件的某一个哈希切片与第二个文件对应的哈希切片做集合操作
- 哈希值切分文件。例如对10000取模,第一个文件可以切分成1万个文件,第二个文件同样切分为1万个文件
- 将第一个文件的第i个片段文件以set结构存储,遍历第二个文件的第i个片段文件中每一个数据,判断是否在第一个文件中即可,依次类推,可以获取两个大文件的并集。
方案二:若允许一定错误率,可以使用布隆过滤器。
多节点海量数据有限内存:64台机器,每台机器两个文件,分别为a、b文件,文件中包含六十亿整数,一个整数一行,每台机器可用内存1G,64个a文件不含重复元素,64个b文件不含重复元素,求64个a文件与64个b文件两大块数据的并集。
方案一:哈希值切分数据,把数据传输到对应节点,分布式问题转化单个节点的问题,走单个节点的逻辑即可。
8. 数据存在性判断
有限数据充足内存:内存中有十万整数,判断某k个数分别是否存在于这十万整数中。
集合判断
单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿整数,一个整数一行,可用内存1G,判断某k个数分别是否存在于这六十亿数据中。
方案一:遍历查找
方案二:bitmap记录存在的数据
方案三:若允许一定误差,使用布隆过滤器
多节点海量数据有限内存:64台机器,每台机器一个文件,文件中包含六十亿整数,一个整数一行,每台机器可用内存1G,判断某k个数分别是否存在于这六十四*六十亿数据中。
方案一:每个节点遍历查找,每个节点传输存在性结果到某个集群节点做结果汇总。
方案二:单节点建立bitmap,每个节点传输存在性结果到某个集群节点做结果汇总。
方案三:若允许一定误差,使用布隆过滤器,每个节点传输存在性结果到某个集群节点做结果汇总。
海量数据有限内存系列问题解决方案总结
- 分而治之,基于hash映射切分数据
- 存在性判断,采用set、前缀树、或者布隆过滤器
- 频率统计,采用hash、前缀树
- 排序,外部排序,例如归并排序
- top-k,堆排序
其他优化:
- 切分数据后,就可以使用多进程或多线程,让每一个进程或者线程负责处理部分数据,由主进程或者主线程聚合结果
- 若为分布式场景,基于MapReduce
https://blog.csdn.net/v_july_v/article/details/7382693
相关文章:
海量数据有限内存系列问题解决方案
1. 排序问题 有限数据充足内存:内存中有十万整数,对所有数据进行排序。 内部排序即可 单节点海量数据有限内存:某台机器有一个文件,文件中包含六十亿整数,一个整数一行,可用内存1G,对所有数据…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,
也就是将摄像头采集到的YUV 的数据换成 AVFrame,然后再次转成 AVPacket,那么这AVPakcet数据要怎么办呢?分为三种情况: 一种是将AVPacket存储成h264文件,由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…...

内容占位符:Kinetic Loader HTML+CSS 使用CSS制作三角形原理
内容占位符 前言 随着我们对HTML和CSS3的学习逐渐深入,相信大家都已经掌握了网页制作的基础知识,包括如何使用HTML标记构建网页结构,以及如何运用CSS样式美化页面。为了进一步巩固和熟练这些技能,今天我们一起来完成一个有趣且实…...

麒麟nginx配置
一、配置负载均衡 配置麒麟的yum源 vim /etc/yum.repos.d/kylin_aarch64.repo Copy 删除原来内容,写入如下yum源 [ks10-adv-os] name Kylin Linux Advanced Server 10 - Os baseurl http://update.cs2c.com.cn:8080/NS/V10/V10SP2/os/adv/lic/base/aarch64/ …...

如何在 Ubuntu 上安装 Emby 媒体服务器
Emby 是一个开源的媒体服务器解决方案,它能让你整理、流媒体播放和分享你的个人媒体收藏,包括电影、音乐、电视节目和照片。Emby 帮你集中多媒体内容,让你无论在家还是在外都能轻松访问。它还支持转码,让你能够播放各种格式的内容…...

Mac上详细配置java开发环境和软件(更新中)
文章目录 概要JDK的配置JDK下载安装配置JDK环境变量文件 Idea的安装Mysql安装和配置Navicat Premium16.1安装安装Vscode安装和配置Maven配置本地仓库配置阿里云私服Idea集成Maven 概要 这里使用的是M3型片 14.6版本的Mac 用到的资源放在网盘 链接: https://pan.baidu.com/s/17…...

jmeter常用配置元件介绍总结之定时器
系列文章目录 安装jmeter jmeter常用配置元件介绍总结之定时器 5.定时器5.1.固定定时器5.2.统一随机定时器5.3.Precise Throughput Timer5.4.Constant Throughput Timer5.5.Synchronizing Timer5.6.泊松随机定时器5.7.高斯随机定时器 5.定时器 5.1.固定定时器 固定定时器Cons…...

Spring——提前编译
提前编译:AOT AOT概述 JIT与AOT的区别 JIT和AOT 这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译 (1)JIT, Just-in-time,动态(即时)编译,边运行边编译࿱…...

乐理的学习(音程)
二度,三度,六度,七度的大n度都是直接的音名到音名,如#A到#G的,这样为大n度 而这个基础上向内收,收半音为小n度,在小n度再收,为减n度 在大n度的基础上再向外扩半音,为增…...

【网络】数据链路层协议——以太网,ARP协议
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是以太网协议和ARP协议。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自…...

Linux分区、挂载、配额、逻辑卷、RAID、系统综合状态查看
分区与挂载 fdisk fdisk 命令是一个用于磁盘分区管理的命令行工具,可以用来创建、删除、调整分区等操作。常用的 fdisk 命令选项包括: fdisk -l:列出系统中的所有磁盘分区信息。 fdisk /dev/sdX:打开指定磁盘进行分区操作。 n&…...

3D Gaussian Splatting 代码层理解之Part1
2023 年初,来自蔚蓝海岸大学和 马克斯普朗克学会的作者发表了一篇题为“用于实时现场渲染的 3D 高斯泼溅”的论文。该论文提出了实时神经渲染的重大进步,超越了NeRF等以前方法的实用性。高斯泼溅不仅减少了延迟,而且达到或超过了 NeRF 的渲染质量,在神经渲染领域掀起了一场…...
Qt小知识-Q_GLOBAL_STATIC
你还在为创建全局静态对象烦恼嘛,它来了!它来了! qt5提供了两个宏定义Q_GLOBAL_STATIC和Q_GLOBAL_STATIC_WITH_ARGS来实现。可以创建一个全局静态对象,对象在第一次使用时初始化自身,这意味着它不会增加应用程序或库的…...
【SpringBoot】使用过滤器进行XSS防御
在Spring Boot中,我们可以使用注解的方式来进行XSS防御。注解是一种轻量级的防御手段,它可以在方法或字段级别对输入进行校验,从而防止XSS攻击。 而想对全局的请求都进行XSS防御可以使用servlet中的过滤器或者spring mvc中的拦截器ÿ…...

创建vue插件,发布npm
开发步骤:1.创建一个vue项目,2.开发一个组件。 3.注册成插件。 4.vite和package.json配置。5.发布到npm 1.创建一个vue项目 npm create vuelatest 生成了vue项目之后,得到了以下结构。 在src下创建个plugins目录。用于存放开发的…...

【Android Compose原创组件】可拖动滚动条的完美实现
项目背景 我在使用安卓Compose开发自己的【JK管理器】的过程中,很多地方都需要使用滚动条,在Github上也有实现的比较好,但是大多都是基于View(我要的是Compose啊)。 在研究Android 官方示例项目 nowinandroid 中&…...

【模块一】kubernetes容器编排进阶实战之资源管理核心概念
kubernetes 资源管理核心概念 k8s的设计理念—分层架构 CRI-container runtime interface-容器运行接口 CNI-container network interface-容器网络接口 CSI-container storage interface-容器存储接口 k8s的设计理念—API设计原则 https://www.kubernetes.org.cn/kubernete…...

用Python设置PowerPoint幻灯片背景
使用Python自动化处理Office文档,如PowerPoint演示文稿,是提高效率和创造力的重要手段。设置PowerPoint幻灯片背景不仅能够增强演示文稿的视觉吸引力,还能帮助传达特定的情感或信息,使观众更加投入。通过编程方式批量修改幻灯片背…...

Restful API接⼝简介及为什么要进⾏接⼝压测
一、RESTful API简介 在现代Web开发中,RESTful API已经成为一种标准的设计模式,用于构建和交互网络应用程序。本文将详细介绍RESTful API的基本概念、特点以及如何使用它来设计高效的API接口。 1. 基于协议 HTTP 或 HTTPS RESTful API通常使用HTTP&am…...
[pyspark] pyspark中如何修改列名字
使用 .withColumnRenamed 来重命名,直接看demo: from pyspark.sql import SparkSessionspark SparkSession.builder.appName("example").getOrCreate()data [("Alice", 1, 200),("Bob", 2, 300),("Charlie",…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...