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的内存如何排序处理?相关推荐

  1. 对于坐拥海量数据的金融企业来说,大数据治理意味着什么?

    玉不琢不成器,一块没有经过雕琢的美玉,需要经过琢磨打造之后,才能显现出它的真正价值.对于金融企业来说,数据不只包括自身业务系统中为支撑正常业务流转的数据,还包括从外界交易流中收获的大量第三方数据,这些 ...

  2. MySQL 学习笔记(1)— 创建/连接/选择/显示数据库(表) 查询单列(多列/所有列)/查询返回特定的行数 各种排序(单列/多列/降序/组合排序) 过滤数据

    本文是对之前学习 MySQL 的一个总结,使用思维导图的方式将涉及到的知识点罗列出来,一方面作为自己对于知识点的归纳,另一方面也便于日后查询. 在该篇文章中将对 MySQL 的基本使用.检索基本数据. ...

  3. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 使用 IDA 分析要修改的内存特征 | 根据内存特征搜索修改点 | 修改进程内存 )

    文章目录 一.使用 IDA 分析要修改的内存特征 二.根据内存特征搜索修改点 三.修改进程内存 一.使用 IDA 分析要修改的内存特征 在前的博客 [Android 逆向]逆向修改游戏应用 ( 分析应 ...

  4. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  5. 《Python数据科学指南》——1.23 采用键排序

    本节书摘来自异步社区<Python数据科学指南>一书中的第1章,第1.23节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区"异 ...

  6. BSS段,数据段,代码段,堆内存和栈

    BSS段,数据段,代码段,堆内存和栈 作者:delnabla 日期:2010-10-26 字体大小: 小 中 大 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的 ...

  7. vba 自动排序_给VBA字典键值排序,并提取需要的数据

    未知的领域很广.风景很美,不要蜷缩在一小块自认为天堂的世界里.待到暮年时安于自欺欺人,要努力提高自己,学习是一件很辛苦的事.要有一颗充满生机的心,把握现在,这才是进取.机会总在等待中出现,越是有意义的 ...

  8. android向DDR读写数据,透过数据看本质 -  被“吹爆”的LPDDR5内存究竟有多强大?...

    透过数据看本质 -  被"吹爆"的LPDDR5内存究竟有多强大? 2020-02-26 22:16:22 6点赞 12收藏 10评论 嗨,大家好!我是Neo! 最近关于LPDDR5 ...

  9. mongo如何删除数据后相应的删除空间和内存占用

    mongo如何删除数据后相应的删除空间和内存占用 Q: mongo数据变大之后,删除不需要的表和数据之后,内存和磁盘空间都没有释放. A: 这是mongo机制,只有删除数据库时才会回收相应的空间,否则 ...

最新文章

  1. python 执行ping命令_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!...
  2. C#过滤重复数据,使用泛型
  3. BIOS——PE无法识别硬盘问题问题解决方案
  4. php oracle 操作 sql语句中能不能添加数组_如何在PHP中使用Oracle数据库_php
  5. matlab编辑rayfile光源文件,rayfile网盘功能详解 rayfile网盘安装步骤及安装注意事项...
  6. idea快速搭建spring cloud-注册中心与注册
  7. Quartus17报错Top-level design entity “dff“ is undefined的解决办法
  8. vue封装echarts示例
  9. VisualGDB系列9:配置VS直接通过SSH方式访问Linux项目
  10. Object-C 语法基础
  11. 怎么用计算机美元和人民币怎么换算,美金换算人民币计算器(人民币和美元换算)...
  12. 先码后看!五大学科竞赛哪个含金量最高?
  13. 好嗨游戏:TapTap9.9分,《鸡你太美》这到底是什么魔鬼游戏?
  14. 调用百度api实现驾车路线和时间距离计算
  15. 分享132个ASP源码,总有一款适合您
  16. 30天自制操作系统第三天
  17. php设置字体为黑体,css如何设置黑体样式
  18. 宏任务与微任务面试题
  19. C# 学习笔记——PL 并行编程 TPL 和传统 .NET 异步编程
  20. 服务器测试之网卡bond测试

热门文章

  1. gif动图怎样裁剪?如何裁剪不影响画质?
  2. vs2019怎么创建html,VS 2019教程:创建ASP.NET Core Web App
  3. 网络模拟EVE-NG配置教程PPT
  4. Django知识点之urls.py路由设置
  5. 一款DIY微头像助手的微信小程序,可以给头像加入各种个性挂件(圣诞帽,中国年,小红旗,口罩)的小程序工具
  6. 上海 借助排污许可制度有望建成环保大数据库
  7. ADB投屏_如何高效投屏你的安卓手机屏幕?
  8. 【视觉定位UV】图像输出之后有放大或者缩小解决办法
  9. 自定义异常,throw,throws和带你去旅行
  10. ios 播放声音 播放震动