对大量数据进行排序

一个100G的文件,内存只有4G,对其进行全排序,如何用普通的java程序编写处理

我们一般说的排序算法是内部排序,指的是可以将所有数据一次性的载入内存当中,然后进行排序。但是,当要排序的数据量相当大的时候,无法将全部的数据加载到内存中,这时就需要采用外部排序的方法,采用分而治之的思想,将大的数据文件切分为小的,内存可以一次加载完成的数据块,对每个数据块进行排序,然后用归并排序将各个数据块进行排序。形成最终的排好序的数据文件。

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,直到全部处理完成。

继续优化
  磁盘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效率)等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值