假设我有X GB的可用RAM空间,并且我需要对一个巨大的数据数组进行排序(该数组远大于所有可用内存。它存储在硬盘上)。您能否给出一些提示,如何实现这个问题?
这两种解决方案有何不同。 根据解决方案1,每个数字只排序一次,但会进行多次比较(第5步),读写仅两次。至于解决方案2,没有合并处理,但每个数字都被读取和写入了三次。
实际上,如果您不想编写太多代码,并且磁盘使用量不是问题,请将数据放入具有适当索引的数据库中,然后只需从中select * order by
即可。
我想你可以构建一种索引系统,将排序后的数据分开。
想象一下图书馆里的书架。遍历1/x的数据,将所有元素分类放在书架上,并将每个书架缓存到磁盘上的单独文件中。然后对下一个1/x的数据进行排序,将其写回磁盘,以此类推。一旦你把所有的数据都放在书架上,就逐个对每个书架进行排序,最后将它们合并成一个漂亮的排序文件。
您可以使用ZZZServer对许多大文件(排序结果可能达到几个TB甚至更大)进行排序。该产品是免费供非商业使用的。我与该产品有关联:
ZZZServer -sortinit -sort file1.txt
ZZZServer -sort file2.txt
ZZZServer -sort file3.txt
...
ZZZServer -sortsave sorted.txt
排序后结果保存在
sorted.txt
您的输入文件必须使用UTF-8或ASCII格式进行编码!
ZZZServer在对大文件进行排序时使用约1MB的RAM!