我需要对不适合内存的巨大二进制文件进行排序。使用排序算法并从I / O设备连续读/写是没有选择的。有没有可能使用像内存映射文件这样的东西?
答案 0 :(得分:4)
一种策略是使用快速排序或其他快速内存排序算法对其中的块进行排序,然后对这些块进行合并排序。
答案 1 :(得分:4)
这是一个已解决的问题,如此维基页面所述:http://en.wikipedia.org/wiki/External_sorting
基本上,读取一些设定数量,对其进行排序,保存到文件中,然后重复。 然后,从每个文件中读取较小的数量,对这些进行排序,并继续直到完成。
更新:
你可能想看看他使用的java代码,听起来他解决了你需要的东西。
http://www.codeodor.com/index.cfm/2007/5/10/Sorting-really-BIG-files/1194
答案 2 :(得分:1)
答案 3 :(得分:0)
如果它们不适合记忆,它们就不适合记忆,而这就是它。您的内存映射不能高于内存限制 - 排序算法一次需要所有数据。
但是,您可以编写专门的排序算法。例如,如果要按字节排序,则应该能够以块的形式循环遍历文件,计算每个字节的出现次数,然后按顺序发出它们。如果您要对每个较大的类型进行排序,只要找到大量重复项,这也可以起作用。
答案 4 :(得分:0)
使用内存映射文件应该有效。它需要适合你的地址空间(32位~2 Gb)或LOTS(如果是64位)。
映射文件的页面将在您访问它们时进行/交换,非常类似于虚拟交换文件,因此它应该可以正常工作。