сортировка слиянием на основе файлов для больших наборов данных в Java

учитывая большие наборы данных, которые не помещаются в память, есть ли библиотека или api для выполнения сортировки в Java? реализация, возможно, будет похожа на сортировку утилиты linux.

2 ответов


Java предоставляет процедуру сортировки общего назначения, которая может использоваться как часть большего решения вашей проблемы. Общий подход к сортировке данных, которые слишком велики, чтобы все поместились в памяти, таков:

1) Прочитайте столько данных, сколько поместится в основную память, скажем, 1 Гб

2) Quicksort, что 1 Гб (вот где вы бы использовать встроенную сортировку Java из рамок коллекций)

3) Напишите, что отсортировали 1 Гб на диск как "chunk-1"

4) повторить шаги 1-3, пока вы не пройдете через все данные, сохраняя каждый фрагмент данных в отдельном файле. Поэтому, если ваши исходные данные были 9 Гб, теперь у вас будет 9 отсортированных кусков данных с надписью "chunk-1" через "chunk-9"

5) Теперь вам просто нужна окончательная сортировка слияния, чтобы объединить 9 отсортированных кусков в один полностью отсортированный набор данных. Сортировка слиянием будет работать очень эффективно против этих предварительно отсортированных кусков. Он по существу откроет 9 читателей файлов (по одному для каждого куска), а также один файловый писатель (для выход.) Затем он сравнивает первый элемент данных в каждом файле читать и выбирает наименьшее значение, которое записывается в выходной файл. Считыватель, из которого это выбранное значение пришло, переходит к следующему элементу данных, и процесс сравнения 9-way для поиска наименьшего значения повторяется, снова записывая ответ в выходной файл. Этот процесс повторяется до тех пор, пока все данные не будут считаны из всех файлов chunk.

6) Как только Шаг 5 закончит чтение всех данных, которые вы сделали -- ваш выходной файл теперь содержит полностью отсортированный набор данных

при таком подходе вы можете легко написать собственную универсальную утилиту "megasort", которая принимает параметр filename и maxMemory и эффективно сортирует файл с помощью временных файлов. Держу пари, вы могли бы найти по крайней мере несколько реализаций для этого, но если нет, вы можете просто свернуть свой собственный, как описано выше.


самый распространенный способ обработки больших массивов данных в памяти (вы можете купить сервер с 1 ТБ в эти дни) или в базе данных.

Если вы не собираетесь использовать базу данных (или купить больше памяти), вы можете написать ее самостоятельно легко.

есть библиотеки, которые могут помочь, которые выполняют функции map-Reduce, но они могут добавить больше сложности, чем они сохраняют.