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. Java实现HTTP文件下载(转)
  2. pytorch中的批量归一化BatchNorm1d和BatchNorm2d的用法、原理记录
  3. NLP Coursera By Michael Collins - Week1
  4. 调研《构建之法》指导下的历届作品
  5. leetcode547. 省份数量
  6. BOA软件服务的移植和BOA服务的配置
  7. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第7节 Arrays工具类_17_Arrays练习:字符串倒序...
  8. PS使用:利用PS制作旋转水晶球gif图
  9. LVM 逻辑卷管理(实战篇)
  10. 凯撒密码中的字符转换
  11. 如何评价一个专业PKM软件?
  12. 54份运算放大器书籍、文档资料合集(54份 0.46G)
  13. 新零售场景下数字化营销运营管理方案
  14. 台式计算机怎么把声音输出,台式电脑音频管理器的设置教程 台式电脑音响没声音怎么弄...
  15. 笔记本电脑蓝牙怎么用来连接耳机
  16. 手把手教你开发BLE数据透传应用程序
  17. 支付宝小程序沙箱支付提示(系统繁忙,请稍后再试)
  18. Kaggle泰坦尼克号船难--逻辑回归预测生存率
  19. ESP8266 WIFI模块学习之路(2)——模块与单片机连接进行远程操作
  20. 如何减少电脑辐射的危害——电脑族必看!

热门文章

  1. 怎么使用计算机唱歌,电脑怎么用麦克风唱歌
  2. image stabilization
  3. 如果您的服务器遇到了DDos攻击,可以考虑以下十种方法来处理
  4. 编程回忆录(一)--大学之前
  5. 残疾人能学计算机吗,残疾人学电脑
  6. 华为android10手机指纹,一文看懂华为Mate 10 Pro因何采用后置指纹识别
  7. 看一篇就够的考研调剂经验贴
  8. .php转为可执行文件,将PHP脚本转换为独立的windows可执行文件
  9. python:个性签名
  10. Android-Kotlin-印章类