转载:https://blog.csdn.net/fx677588/article/details/72471357

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效率)等。

最新文章

  1. 微信公众账号第三方平台全网发布源码(java)- 实战测试通过
  2. java-解决业务操可能数据冲突问题
  3. java中向JTextArea中添加滚动条(垂直的和水平的)
  4. IE代理文件自动设置
  5. Mesa10.2在Win7上的编译
  6. Swift 本地推送通知UILocalNotification
  7. hadoop的核心思想
  8. centos 6.5 服务器安装 (LNMP ntfs文件支持 PHP-RPM CHROOT沙盒)
  9. 外键约束列并没有导致大量建筑指数library cache pin/library cache lock
  10. 探讨VMP 2.12.3 导入表修复
  11. genymotion+Oracle VM VirtualBox + eclipse + appium 脚本运行慢解决步骤
  12. poj2032Square Carpets(IDA* + dancing links)
  13. jQuery EasyUI API 中文文档 - 链接按钮(linkbutton)
  14. C# 根据IP获取省市
  15. LeetCode OJ 104. Maximum Depth of Binary Tree
  16. MVC - 云服务器部署
  17. 使用EPPlus读写xlsx文件
  18. python扒取百宝彩网站江西快三当日期号及开奖结果
  19. .NET(C#)连接各类数据库代码-集锦
  20. 记录display:table的使用

热门文章

  1. 【bzoj1606】[Usaco2008 Dec]Hay For Sale 购买干草 背包dp
  2. CodeForces - 704C
  3. 【BZOJ4031】小Z的房间(矩阵树定理)
  4. BZOJ5333:[SDOI2018]荣誉称号——题解
  5. [Leetcode] search insert position 寻找插入位置
  6. Dynamic Rankings——带修改区间第k大
  7. NYOJ 832 DP
  8. HDU1542 扫描线+离散化
  9. each jquery
  10. vs报错“以下文件中的行尾不一致,是否将行尾标准化”