海量数据排序问题——如果有1TB的数据需要排序,但只有32GB的内存如何排序处理?
1、外排序
传统的排序算法一般指内排序算法,针对的是数据可以一次全部载入内存中的情况。但是面对海量数据,即数据不可能一次全部载入内存,需要用到外排序的方法。外排序采用分块的方法(分而治之),首先将数据分块,对块内数据按选择一种高效的内排序策略进行排序。然后采用归并排序的思想对于所有的块进行排序,得到所有数据的一个有序序列。
例如,考虑一个1G文件,可用内存100M的排序方法。首先将文件分成10个100M,并依次载入内存中进行排序,最后结果存入硬盘。得到的是10个分别排序的文件。接着从每个文件载入9M的数据到输入缓存区,输出缓存区大小为10M。对输入缓存区的数据进行归并排序,输出缓存区写满之后写在硬盘上,缓存区清空继续写接下来的数据。对于输入缓存区,当一个块的9M数据全部使用完,载入该块接下来的9M数据,一直到所有的9个块的所有数据都已经被载入到内存中被处理过。最后我们得到的是一个1G的排序好的存在硬盘上的文件。
2、1TB数据使用32GB内存如何排序
①、把磁盘上的1TB数据分割为40块(chunks),每份25GB。(注意,要留一些系统空间!)
②、顺序将每份25GB数据读入内存,使用quick sort算法排序。
③、把排序好的数据(也是25GB)存放回磁盘。
④、循环40次,现在,所有的40个块都已经各自排序了。(剩下的工作就是如何把它们合并排序!)
⑤、从40个块中分别读取25G/40=0.625G入内存(40 input buffers)。
⑥、执行40路合并,并将合并结果临时存储于2GB 基于内存的输出缓冲区中。当缓冲区写满2GB时,写入硬盘上最终文件,并清空输出缓冲区;当40个输入缓冲区中任何一个处理完毕时,写入该缓冲区所对应的块中的下一个0.625GB,直到全部处理完成。
3、继续优化
磁盘I/O通常是越少越好(最好完全没有),那么如何降低磁盘I/O操作呢?关键就在第5和第6步中的40路输入缓冲区,我们可以先做8路merge sort,把每8个块合并为1路,然后再做5-to-1的合并操作。
再深入思考一下,如果有多余的硬件,如何继续优化呢?有三个方向可以考虑:
使用并发:如多磁盘(并发I/O提高)、多线程、使用异步I/O、使用多台主机集群计算。
提升硬件性能:如更大内存、更高RPM的磁盘、升级为SSD、Flash、使用更多核的CPU。
提高软件性能:比如采用radix sort、压缩文件(提高I/O效率)等。
海量数据排序问题——如果有1TB的数据需要排序,但只有32GB的内存如何排序处理?相关推荐
- 对于坐拥海量数据的金融企业来说,大数据治理意味着什么?
玉不琢不成器,一块没有经过雕琢的美玉,需要经过琢磨打造之后,才能显现出它的真正价值.对于金融企业来说,数据不只包括自身业务系统中为支撑正常业务流转的数据,还包括从外界交易流中收获的大量第三方数据,这些 ...
- MySQL 学习笔记(1)— 创建/连接/选择/显示数据库(表) 查询单列(多列/所有列)/查询返回特定的行数 各种排序(单列/多列/降序/组合排序) 过滤数据
本文是对之前学习 MySQL 的一个总结,使用思维导图的方式将涉及到的知识点罗列出来,一方面作为自己对于知识点的归纳,另一方面也便于日后查询. 在该篇文章中将对 MySQL 的基本使用.检索基本数据. ...
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 使用 IDA 分析要修改的内存特征 | 根据内存特征搜索修改点 | 修改进程内存 )
文章目录 一.使用 IDA 分析要修改的内存特征 二.根据内存特征搜索修改点 三.修改进程内存 一.使用 IDA 分析要修改的内存特征 在前的博客 [Android 逆向]逆向修改游戏应用 ( 分析应 ...
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...
- 《Python数据科学指南》——1.23 采用键排序
本节书摘来自异步社区<Python数据科学指南>一书中的第1章,第1.23节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区"异 ...
- BSS段,数据段,代码段,堆内存和栈
BSS段,数据段,代码段,堆内存和栈 作者:delnabla 日期:2010-10-26 字体大小: 小 中 大 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的 ...
- vba 自动排序_给VBA字典键值排序,并提取需要的数据
未知的领域很广.风景很美,不要蜷缩在一小块自认为天堂的世界里.待到暮年时安于自欺欺人,要努力提高自己,学习是一件很辛苦的事.要有一颗充满生机的心,把握现在,这才是进取.机会总在等待中出现,越是有意义的 ...
- android向DDR读写数据,透过数据看本质 - 被“吹爆”的LPDDR5内存究竟有多强大?...
透过数据看本质 - 被"吹爆"的LPDDR5内存究竟有多强大? 2020-02-26 22:16:22 6点赞 12收藏 10评论 嗨,大家好!我是Neo! 最近关于LPDDR5 ...
- mongo如何删除数据后相应的删除空间和内存占用
mongo如何删除数据后相应的删除空间和内存占用 Q: mongo数据变大之后,删除不需要的表和数据之后,内存和磁盘空间都没有释放. A: 这是mongo机制,只有删除数据库时才会回收相应的空间,否则 ...
最新文章
- python 执行ping命令_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!...
- C#过滤重复数据,使用泛型
- BIOS——PE无法识别硬盘问题问题解决方案
- php oracle 操作 sql语句中能不能添加数组_如何在PHP中使用Oracle数据库_php
- matlab编辑rayfile光源文件,rayfile网盘功能详解 rayfile网盘安装步骤及安装注意事项...
- idea快速搭建spring cloud-注册中心与注册
- Quartus17报错Top-level design entity “dff“ is undefined的解决办法
- vue封装echarts示例
- VisualGDB系列9:配置VS直接通过SSH方式访问Linux项目
- Object-C 语法基础
- 怎么用计算机美元和人民币怎么换算,美金换算人民币计算器(人民币和美元换算)...
- 先码后看!五大学科竞赛哪个含金量最高?
- 好嗨游戏:TapTap9.9分,《鸡你太美》这到底是什么魔鬼游戏?
- 调用百度api实现驾车路线和时间距离计算
- 分享132个ASP源码,总有一款适合您
- 30天自制操作系统第三天
- php设置字体为黑体,css如何设置黑体样式
- 宏任务与微任务面试题
- C# 学习笔记——PL 并行编程 TPL 和传统 .NET 异步编程
- 服务器测试之网卡bond测试
热门文章
- gif动图怎样裁剪?如何裁剪不影响画质?
- vs2019怎么创建html,VS 2019教程:创建ASP.NET Core Web App
- 网络模拟EVE-NG配置教程PPT
- Django知识点之urls.py路由设置
- 一款DIY微头像助手的微信小程序,可以给头像加入各种个性挂件(圣诞帽,中国年,小红旗,口罩)的小程序工具
- 上海 借助排污许可制度有望建成环保大数据库
- ADB投屏_如何高效投屏你的安卓手机屏幕?
- 【视觉定位UV】图像输出之后有放大或者缩小解决办法
- 自定义异常,throw,throws和带你去旅行
- ios 播放声音 播放震动