Java中大型数据集的基于文件的合并排序

给定不适合内存的大型数据集,是否有任何库或api在Java中执行排序? 实现可能类似于linux实用程序排序。

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

1)读取适合主存储器的数据,假设它是1 Gb

2)1 Gb的Quicksort(这里是你在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参数,并使用临时文件有效地对文件进行排序。 我敢打赌,你可以找到至少一些实现,但如果没有,你可以像上面所描述的那样自己滚动。

处理大型数据集的最常用方法是在内存中(这些天你可以购买1 TB的服务器)或者在数据库中。

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

有些库可能有助于执行Map-Reducefunction,但它们可能会增加比保存更多的复杂性。