一、大文件排序问题
设想你有一个20GB的文件,每行一个字符串,说明如何对这个文件进行排序。
内存肯定没有20GB大,所以不可能采用传统排序法。但是可以将文件分成许多块,每块xMB,针对每个快各自进行排序,存回文件系统。
然后将这些块逐一合并,最终得到全部排好序的文件。
题目
:有一个大文件,里面记录了若干数字,把这些数字进行排序。文件大小远大于内存大小。思路
:内存极少的情况下,利用分治策略,利用外存保存中间结果,再用多路归并来排序。
(1)按可用内存的大小,把外存上含有n个记录的文件分成若干个长度为L的子文件,把这些子文件依次读入内存,并利用有效的内部排序方法对它们进行排序,再将排序后得到的有序子文件重新写入外存;
(2)对这些有序子文件逐趟归并,使其逐渐由小到大,直至得到整个有序文件为止。
二、对若干小文件进行排序
题目
:有N(N远大于10)个1MB的小文件,文件里记录了若干数字,现要求在2M内存里对这些小文件中的数字排序。思路
:多路归并排序
- 首先对每个小文件中的数字排序,2M内存足够对1M数字排序。
- 现在有了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写入大文件。
也就是说,最小值属于哪个文件,那么就从哪个文件当中取下一行数据。
(因为小文件内部有序,下一行数据代表了它当前的最小值)