【问题标题】:Sorting large, binary, fixed length records with QSORT使用 QSORT 对大型、二进制、固定长度记录进行排序
【发布时间】:2014-09-18 07:57:57
【问题描述】:

我想在qsort 的帮助下对一个包含 20 字节(它不是结构)二进制记录的大文件进行排序。文件中有 800 000 000 条记录。

我有两个问题:

  • qsort 的比较函数中对 20 字节记录进行排序的最佳方法是什么?

    int compare(const void *a, const void *b)
    
  • 以及如何简单地对 800 000 000 条记录进行排序?我不能把它全部放在记忆中..

【问题讨论】:

  • 800000000 条记录,每条 20 字节?
  • 为什么要快速排序?使用外部排序(基于归并排序),或使用多处理排序的一些 Terra-sort 现有实现。
  • > 为什么要快速排序?只是我不知道其他解决方案..
  • “不能把它全部放在内存中”如果你有一个 32 位进程,这可能是正确的,但是在一个具有大内存的 64 位系统中,它应该非常适合。如果您不想加载到内存中,那么对“文件”使用某种排序方法可能是最好的方法。
  • 如前所述,外部排序通常是某种类型的合并排序。如果你读/写大量数据,比如一次 10MB 到 100MB,那么随机访问开销会减少,你可以使用更大的 k 路合并排序,k 等于 8 或 16,具体取决于你有多少内存有空。

标签: c++ sorting record binary-data qsort


【解决方案1】:

正如许多评论者所提到的,这对于 external sorting algorithm 来说似乎是一项很棒的工作,这是一种排序算法,专为无法一次将所有对象放入内存中排序的情况而设计。许多排序算法都可以适应此设置,例如快速排序、桶排序和归并排序。如果您想要一个相对简单的选项,请考虑使用 k 路外部合并排序:将数据拆分为多个范围,使每个范围都适合内存,对内存中的每个范围进行排序,然后将结果写回磁盘。然后,对这些范围进行 k 路合并:打开每个文件进行读取,一次读取每个文件的一个大块,并对这些块使用正常的 k 路合并操作。任何时候你耗尽一个块中的所有元素,只需从文件中读取另一个块。

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 2019-04-20
    • 1970-01-01
    • 2014-08-20
    • 2010-10-21
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多