双通多路合并排序?

时间:2009-05-21 14:28:11

标签: sorting

如果我有一个不适合内存的关系(SQL),我想使用TPMMS(两遍多路合并排序方法)对关系进行排序。我如何将子表中的表(以及多少)除以内存并合并它们? 假设我正在使用C#。

1 个答案:

答案 0 :(得分:8)

我没有追求目前两通道多路合并排序的定义,但是“外部排序”理论(数据太大而无法适应内存)几乎是标准的。任何体面的算法书都会涵盖它;在许多其他人中,你可以看看Knuth,Sedgewick或(对于软件考古学家)Kernighan&普劳格Software Tools

基本技术很简单:

  1. 读取数据,直到没有剩余空间。
  2. 排序。
  3. 写入临时文件。
  4. 从1开始重复,直到没有数据可供阅读。
  5. 你知道你有多少临时文件,N。
  6. 您需要确定一次可以读取多少个文件,M。
  7. 如果N> M,然后你设计你的合并阶段,以便最后一个阶段将合并M个文件。
  8. 您将M个文件集合并到新的临时文件中,直到您到达最后一次合并。
  9. 将最终的M个文件集合(或N,如果N< M)写入最终目的地。
  10. 所有标准都非常标准 - 但是有一些挑剔的细节可以做对。

    在AT& T的Unix系统读物第二卷中有一篇很好的文章称为“构建工作排序例程中的理论与实践”,如果你认真学习如何处理外部排序,你应该找到并阅读。但是,当你阅读它时,请记住机器自写入以来发生了巨大的变化,主内存为千兆字节(而不是兆字节)和太字节的磁盘空间(或SSD - 而不是兆字节)。