Java对大文件进行排序、对若干小文件进行排序

一、大文件排序问题

设想你有一个20GB的文件,每行一个字符串,说明如何对这个文件进行排序。

内存肯定没有20GB大,所以不可能采用传统排序法。但是可以将文件分成许多块,每块xMB,针对每个快各自进行排序,存回文件系统。

然后将这些块逐一合并,最终得到全部排好序的文件。

  • 题目:有一个大文件,里面记录了若干数字,把这些数字进行排序。文件大小远大于内存大小。
  • 思路:内存极少的情况下,利用分治策略,利用外存保存中间结果,再用多路归并来排序。

(1)按可用内存的大小,把外存上含有n个记录的文件分成若干个长度为L的子文件,把这些子文件依次读入内存,并利用有效的内部排序方法对它们进行排序,再将排序后得到的有序子文件重新写入外存;

(2)对这些有序子文件逐趟归并,使其逐渐由小到大,直至得到整个有序文件为止。

二、对若干小文件进行排序

  • 题目:有N(N远大于10)个1MB的小文件,文件里记录了若干数字,现要求在2M内存里对这些小文件中的数字排序。
  • 思路:多路归并排序
  1. 首先对每个小文件中的数字排序,2M内存足够对1M数字排序。
  2. 现在有了N个有序的小文件,怎么合并成1个有序的大文件?
    在这里插入图片描述

举例说明:
文件1:3,6,9
文件2:2,4,8
文件3:1,5,7

第一回合:
文件1的最小值:3 , 排在文件1的第1行
文件2的最小值:2,排在文件2的第1行
文件3的最小值:1,排在文件3的第1行
那么,这3个文件中的最小值是:min(1,2,3) = 1
也就是说,最终大文件的当前最小值,是文件1、2、3的当前最小值的最小值,绕么?
上面拿出了最小值1,写入大文件.

第二回合:
文件1的最小值:3 , 排在文件1的第1行
文件2的最小值:2,排在文件2的第1行
文件3的最小值:5,排在文件3的第2行
那么,这3个文件中的最小值是:min(5,2,3) = 2
将2写入大文件

也就是说,最小值属于哪个文件,那么就从哪个文件当中取下一行数据。
因为小文件内部有序,下一行数据代表了它当前的最小值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值