C++对巨大的二进制文件进行排序

C++ Sorting huge binary files

本文关键字:排序 二进制文件 巨大 C++      更新时间:2023-10-16

我需要对无法放入内存的巨大二进制文件进行排序。使用排序算法并从I/O设备连续读取/写入是没有选择的。有没有可能使用类似内存映射文件的东西?

这是一个已解决的问题,如本wiki页面所述:http://en.wikipedia.org/wiki/External_sorting

基本上,读取一定数量的内容,对其进行排序,保存到文件中,然后重复。然后,从每个文件中读取少量内容,对这些文件进行排序,然后继续,直到完成为止。

更新

你可能想看看他使用的java代码,听起来他解决了你需要的问题。

http://www.codeodor.com/index.cfm/2007/5/10/Sorting-really-BIG-files/1194

一种策略是使用快速排序或其他快速内存排序算法对其中的块进行排序,然后对这些块进行合并排序。

这里有一个很好的C++11解决方案:

https://github.com/alveko/external_sort

以及其他一些选项:

  • https://github.com/arq5x/kway-mergesort
  • https://stxxl.org/
  • https://github.com/owaisnm/external-sort
  • https://gist.github.com/manangandhi7/98d2cdd12c7800aaea3ecdc41a7755e3

如果它们不适合内存,那么它们就不适合内存了,差不多就是这样。你不能在超过内存限制的情况下进行内存映射——排序算法需要一次处理所有数据。

但是,您可以编写一个专门的排序算法。例如,如果您是按字节排序的,那么您应该能够以块的形式在文件中循环,计算每个字节的出现次数,然后按顺序发出它们。如果你对每个较大的类型进行排序,只要有足够的重复项,这也可以奏效。