Algorithm 如何对大文件进行排序(不适合RAM)

Algorithm 如何对大文件进行排序(不适合RAM),algorithm,sorting,bigdata,Algorithm,Sorting,Bigdata,假设有一个算法X需要两个步骤才能最终输出到文件 收集数据 排序数据 我们还可以说,收集的数据太大,无法保存在RAM中,并且在步骤2采取行动之前已写入文件 例如,以包含数字的500GB文件作为步骤1的输出。每行一个数字。步骤2必须按升序对行进行排序 步骤2如何在不读取整个输入文件的情况下有效地对数字进行排序 最有效的方法是将交换空间增加500 GB并进行一次排序,让操作系统内存管理器处理缓存 另一种方法是将数据分割成合适的片段,例如250个2GB文件。对每一个文件进行排序,然后对结果进行合并排序。

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

  • 收集数据
  • 排序数据
  • 我们还可以说,收集的数据太大,无法保存在RAM中,并且在步骤2采取行动之前已写入文件

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


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

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

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

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

    如果可以对数据进行排列,使每个要排序的记录都位于单独的行上,则“拆分”功能将一个大文件拆分为多个小文件。每个较小的文件都可以使用Gnu排序功能在内存中单独排序,最后,所有已排序的较小文件都可以使用Gnu排序的另一个选项合并排序回一个大文件

    见:

    • 拆分:
    • 排序:

    我想,第一种方法可能会导致可怕的打击。第二种方法是正确的。使用高效算法在RAM中尽可能多地排序,然后合并块。IO将是瓶颈,因此优化合并读写可能是一个好主意。实际上,使用非HDD存储(SSD、云)可能会有所帮助。进行交换会带来可怕的性能问题。不要采用第一种方法。如果同时实现收集器和分拣机,那么这种方法的可能重复也很有用,为什么不在数据逐件到达时对其进行排序(插入排序等),以便生成的文件包含排序列表?