最近要排序一个比较大的文件,大概5G左右。文件中每行由两部分组成:“id DocNo”。其中id是一个数字,DocNo是一个字符串。我需要把这个大文件按照DocNo进行排序(字典序)。
要把这个文件加入内存是不太可能的,所以必须把它分解为小文件,然后把小文件加入到内存中进行排序。然后再把小文件组合起来。这有点类似于归并排序,不过需要注意的是,这里的归并是对文件的归并。
分文件也有几种策略。第一种可以将这个5G的文件分解成5个1G的小文件,然后分别对这个5个小文件进行排序,最后对这5个文件进行归并。归并也比较简单,可以直接对这个5个文件进行归并,也可以两两进行归并。另一种分解策略是将文件分成两个,然后对于小文件继续进行分解,知道能够装入内存。也就是说,这是一种二分的策略。
最后,我采用的是二分的策略,代码很简单,不过需要注意的是细节。没个细节都要考虑到。开始我就有一个小细节没有考虑到,最后导致程序跑了一个晚上后结果还是错的。不多说了,下面直接上代码(利用递归):