C++对巨大的二进制文件进行排序
C++ Sorting huge binary files
我需要对无法放入内存的巨大二进制文件进行排序。使用排序算法并从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
如果它们不适合内存,那么它们就不适合内存了,差不多就是这样。你不能在超过内存限制的情况下进行内存映射——排序算法需要一次处理所有数据。
但是,您可以编写一个专门的排序算法。例如,如果您是按字节排序的,那么您应该能够以块的形式在文件中循环,计算每个字节的出现次数,然后按顺序发出它们。如果你对每个较大的类型进行排序,只要有足够的重复项,这也可以奏效。
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- 在排序链表中插入结构并将其写入二进制文件
- 在不使用数组的情况下对二进制文件中的数据进行排序
- c++二进制文件排序
- C++对巨大的二进制文件进行排序