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

use*_*187 10 java sorting large-data

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

Mag*_*nus 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参数,并使用临时文件有效地对文件进行排序.我打赌你可以找到至少一些实现,但如果没有你可以像上面所描述的那样自己滚动.

  • 我找到了一篇有关此方法的文章,其中包括Java代码:http://www.codeodor.com/index.cfm/2007/5/10/Sorting-really-BIG-files/1194 (2认同)