海量数据排序,数据量大于内存大小,如何实现排序

文章介绍了面对海量数据时,由于内存限制而采用的外排序方法。通过分块、内排序、多路归并等策略,详细阐述了如何对1G、1TB等大规模数据进行排序,涉及的关键步骤包括数据分块、内存管理、归并策略等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路

传统的排序算法一般指内排序算法,针对的是数据可以一次全部载入内存中的情况。但是面对海量数据,即数据不可能一次全部载入内存,需要用到外排序的方法。
外排序采用分块的方法(分而治之),首先将数据分块,对块内数据按选择一种高效的内排序策略进行排序。然后采用归并排序的思想对于所有的块进行排序,得到所有数据的一个有序序列。

示例1

例如,考虑一个1G文件,可用内存100M的排序方法。首先将文件分成10个100M,并依次载入内存中进行排序,最后结果存入硬盘。得到的是10个分别排序的文件。
接着从每个文件载入9M的数据到输入缓存区,输出缓存区大小为10M。对缓存区的数据进行归并排序,缓存区写满之后写在硬盘上,缓存区清空继续写接下来的数据。对于输入缓存区,当一个块的9M数据全部使用完,载入该块接下来的9M数据,一直到所有的9个块的所有数据都已经被载入到内存中被处理过。最后我们得到的是一个1G的排序好的存在硬盘上的文件。

示例2

1TB数据使用32GB内存如何排序
把磁盘上的1TB数据分割为40块(chunks),每份25GB。(注意,要留一些系统空间!)
顺序将每份25GB数据读入内存,使用quick sort算法排序。
把排序好的数据(也是25GB)存放回磁盘。
循环40次,现在,所有的40个块都已经各自排序了。(剩下的工作就是如何把它们合并排序!)

从40个块中分别读取25G/40=0.625G入内存(40 input buffers)。
执行40路合并,并将合并结果临时存储于2GB 基于内存的输出缓冲区中。当缓冲区写满2GB时,写入硬盘上最终文件,并清空输出缓冲区;当40个输入缓冲区中任何一个处理完毕时,写入该缓冲区所对应的块中的下一个0.625GB,直到全部处理完成。

示例3

根据内存1G,数据10G,我们将10G数据切分成10份,通过内存调用磁盘的方式,每1G进行排序,排序结束后,我们会得到10个有序的数据数组。
归并:多路归并过程可以使用最小堆。
内存中开辟一个大小为10的最小堆,和一个缓冲区(小于1G,不要太小)。
取10份排序好的数据的首位进入最小堆。则最小的数位于堆顶,移除堆顶元素并写入缓冲区,然后从移除元素的元素所属数组中的下一位进入最小堆,再次移除堆顶进入缓冲区…直到缓冲区满,缓冲区回写磁盘,清空缓冲区,再次将数据置入最小堆…
直到10份数据全部写完,然后将最小堆的元素按顺序回写磁盘即可。

来源:https://blog.youkuaiyun.com/FX677588/article/details/72471357
https://blog.youkuaiyun.com/fengyuyeguirenenen/article/details/125095520

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值