鉴于大数据集不适合内存,是否有任何库或api在Java中执行排序? 实现可能类似于linux实用程序排序。
答案 0 :(得分:15)
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 :(得分:0)
处理大型数据集的最常用方法是在内存中(最近可以购买1 TB的服务器)或者在数据库中。
如果您不打算使用数据库(或购买更多内存),您可以轻松自己编写。
有些库可能有助于执行Map-Reduce功能,但它们可能会增加比保存更多的复杂性。