External Merge Sort

Posted by Peinan on March 25, 2020

面试时遇到的一个问题

对一个超大的数据文件进行排序(无法一次全部加载到内存中)

解法 外归并排序(External Merge Sort),归并排序的变种,类似K路指针算法。

假设有一个900MB的数据文件,但我们只有100MB可用内存。

首先把900MB数据文件拆成9个100MB的文件。依次将这9个100MB文件分别排序(可以实现,因为我们有100MB可用内存)。

接下来进行归并排序的Merge部分。

将100MB可用内存拆成10MB*9 + 10MB,每个子文件设置10MB缓冲区(也就是说保持每个文件只有10MB的数据在程序中)

假设最终输出文件为data.out,我们使用9个指针指向这9个缓冲区,每次我们将这九个指针指向的数中最小的数取出,放到data.out中,并将该指针往下挪一位。

当某一个缓冲区指针已经指向缓冲区末尾时,释放整个10MB缓冲区,并重新加载对应子文件的下一个10MB数据入内存中。(如果某一子文件数据全部处理完成,则指针可以置空,不在考虑这一指针。)

如此,就可以完成对一个超大文件的排序。