对超大文本文件进行排序(这里的排序一般指按行进行排序),是一种很特殊需求,这种“超大”的文本文件一般是指远远超出内存大小因而无法一次加载进内存来进行排序的文件,它的处理方式和一般的排序算法肯定会有所不同。另外,有时候还需要对文本进行去除重复行的任务。本文将给出一个算法思路和实际示例。本文中使用了Go语言(Golang)来进行举例,但实际上用其他语言也可以实现相同的功能。选用Go语言是因为它的效率较高,毕竟号称是“最接近于C语言的高级语言”。-首先用一个io.Reader对象来分段读取文件中的内容,假设文件大小有10G(字节)之大,而可用内存仅为4G,比较保守地我们可以每次读取M左右的数据写入依次编号的文件中,也就是用M字节大小的字节切片作为缓冲区;这样会产生50个新的文件,每个文件大小约为M字节;-在写入这50个文件时,可以先进行按行排序;这样就得到50个内部已经排好序的文本文件;而由于每个文件的数据量远远小于内存总数量,所以这个排序在内存中是没有问题的;-新建一个用于写入最终结果的文本文件,并用bufio.Writer来进行追加写入,且可以每次只追加一行;-然后同时打开前面那50个排好序的文件,用bufio.Reader来从每个文件读取第一行,并比较这50个第一行中哪个排名最靠前(最大或最小,根据升序或降序的排序要求),假设第5个文件中的这行最靠前,则将这一行追加到结果文件,然后再从第5个文件中读取下一行替代已被追加到结果的那行重新与其他行做比较;-如此循环重复,直至所有的文件被读取完毕;此时的输出文件就是已经经过排序好的最终文件了。这样,循环执行完毕之后,结果文件就将是完全排好序之后的超大文本文件了。下面是使用这个思路实现的实际示例代码:本文中的代码可以在
转载请注明:
http://www.aideyishus.com/lkcf/7566.html