关于海量数据的排序,求思路
有一个几百万条记录的文件,记录的结构体为:
typedef struct
{
uint32 song_id;//歌曲ID
uint32 singer_id;//歌手ID
char initial[8];//歌曲名首字母
char song_title[20];//歌曲名称
}RCD_SONG;
要求以歌手ID进行排序,歌手ID相同的记录可以无序。前提是硬件内存有限,只能采取外部排序。求思路!谢谢! struct c
[解决办法]
uint32 singer_id; //歌手ID
这个多少位?
用一个数组,用singer_id作为下标(最大值如果为10亿,全世界没那么多歌手)。
数组值只为0或者1,用一个bit存储即可。
声明一个可以包含10位整数的bit 数组(10 亿) ,一共需要120M 内存
接下来,不多说,你懂的。
[解决办法]
最近了解了下levelDB
它的排序方法楼主可以去看下,
我受其启发,想了一个算法,只需要很少的内存。
楼主看下
step1 依次读入n条记录,比如n = 1000,在内存中排好序.写成一个文件file1 。 标记这n个最大最小值. file1 max, file1 min. 把信息储存到一个表table_index中。
step2 重复step 1 , 遍历所有的记录,得到m个文件以及标table_index。
step3 检查table中,所有文件的最大最小时是否有交错,若没有,退出,排序完成。 若有,按照从最小到大的文件顺序将交错文件作为输入,进行归并排序。输出为n条一个文件,更新table_index.
重复step3 知道排序完成