【问题标题】:How to sort a big file (not fitting in RAM)如何对大文件进行排序(不适合 RAM)
【发布时间】:2014-08-10 13:41:34
【问题描述】:

假设有一个算法 X,它需要 2 个步骤才能最终输出到文件。

  1. 收集数据
  2. 排序数据

我们也可以说收集的数据太大而无法保存在 RAM 中,并且在第 2 步采取行动之前已写入文件。

例如,将一个包含数字的 500GB 文件作为步骤 1 的输出。每行一个数字。第 2 步必须按升序对行进行排序。

第 2 步如何在不读取整个输入文件的情况下有效地对数字进行排序?

【问题讨论】:

标签: algorithm sorting bigdata


【解决方案1】:

最有效的方法是将交换空间增加 500 GB 并进行一次排序,让操作系统内存管理器处理缓存。

另一种方法是将数据分成适合的部分,例如 250 个 2GB 文件。对每一项进行排序,然后对结果进行归并排序。

【讨论】:

  • 第一种方法可能会导致可怕的颠簸,我想。
  • 第二种方法是正确的。使用有效的算法在 RAM 中尽可能多地排序,然后合并块。 IO 将成为瓶颈,因此优化合并读取和写入可能是一个好主意。在实践中,使用非 HDD 存储(SSD、云)可能会有所帮助。
  • 去交换有可怕的性能问题。不要采取第一种方法。
【解决方案2】:

“GNU CoreUtils”可用作源代码,或内置于 Linux 发行版,可用于 Windows 预编译,包含 Gnu 拆分和 Gnu 排序例程。

如果您的数据可以排列成每条用于排序的记录位于单独的行上,那么拆分功能会将一个大文件拆分为多个较小的文件。每个较小的文件可以使用 Gnu 排序功能在内存中单独排序,最后所有已排序的较小文件可以使用 Gnu 排序的另一种选项合并排序回一个大文件。

见:

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 2012-01-24
    • 2015-08-25
    • 2013-05-15
    • 1970-01-01
    • 2011-12-16
    • 2021-02-15
    • 2020-09-08
    • 1970-01-01
    相关资源
    最近更新 更多