【问题标题】:file based merge sort on large datasets in JavaJava中大型数据集的基于文件的合并排序
【发布时间】:2011-09-12 23:07:38
【问题描述】:

给定无法放入内存的大型数据集,是否有任何库或 API 可以在 Java 中执行排序? 实现可能类似于 linux 实用程序排序。

【问题讨论】:

    标签: java sorting large-data


    【解决方案1】:

    Java 提供了一个通用的排序例程,它可以用作解决问题的更大解决方案的一部分。对太大而无法全部放入内存的数据进行排序的常用方法是:

    1) 尽可能多地读取适合主内存的数据,假设它是 1 Gb

    2) 对 1 Gb 进行快速排序(在这里您可以使用来自 Collections 框架的 Java 内置排序)

    3) 将排序的 1 Gb 作为“chunk-1”写入磁盘

    4) 重复步骤 1-3,直到完成所有数据,将每个数据块保存在单独的文件中。因此,如果您的原始数据为 9 Gb,那么您现在将拥有 9 个已排序的数据块,标记为“chunk-1”到“chunk-9”

    5) 您现在只需要一个最终的合并排序来将 9 个已排序的块合并为一个完全排序的数据集。合并排序将对这些预先排序的块非常有效地工作。它将基本上打开 9 个文件读取器(每个块一个),加上一个文件写入器(用于输出)。然后它比较每个读取文件中的第一个数据元素并选择最小值,将其写入输出文件。选择值来自的读取器前进到其下一个数据元素,并重复 9 路比较过程以找到最小值,再次将答案写入输出文件。重复此过程,直到从所有块文件中读取所有数据为止。

    6) 在第 5 步完成读取所有数据后,您的输出文件现在包含一个完全排序的数据集

    使用这种方法,您可以轻松编写自己的通用“megasort”实用程序,该实用程序采用文件名和 maxMemory 参数并使用临时文件有效地对文件进行排序。我敢打赌,您至少可以找到一些实现,但如果没有,您可以按照上述方式自行推出。

    【讨论】:

    【解决方案2】:

    处理大型数据集的最常见方法是在内存中(现在您可以购买 1 TB 的服务器)或在数据库中。

    如果您不打算使用数据库(或购买更多内存),您可以自己轻松编写。

    有些库可能有助于执行 Map-Reduce 功能,但它们增加的复杂性可能比节省的更多。

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 2020-09-29
      • 2019-06-12
      • 2021-06-28
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多