Я ищу алгоритмы сортировки, которые могут работать с большим объемом данных, то есть, которые могут работать, даже если весь набор данных не может храниться в основной памяти одновременно.
Единственный кандидат, который я нашел до сих пор, - это сортировка слиянием: вы можете реализовать алгоритм таким образом, чтобы он сканировал ваш набор данных при каждом слиянии, не сохраняя все данные в основной памяти сразу. Разновидность сортировки слиянием, которую я имею в виду, описана в этой статье в разделе Использование с ленточными накопителями .
Я думаю, что это хорошее решение (со сложностью O (nx log (n)), но мне любопытно узнать, есть ли другие (возможно, более быстрые) алгоритмы сортировки, которые могут работать с большими наборами данных, которые не помещаются в основную память.
РЕДАКТИРОВАТЬ
Вот некоторые подробности, как того требуют ответы:
- Данные необходимо сортировать периодически, например, раз в месяц. Мне не нужно вставлять несколько записей и сортировать данные постепенно.
- Мой пример текстового файла составляет около 1 ГБ текста UTF-8, но я хотел решить проблему в целом, даже если файл был, скажем, 20 ГБ.
- Его нет в базе данных, и из-за других ограничений этого не может быть.
- Данные сбрасываются другими в виде текстового файла, у меня есть свой код для чтения этого текстового файла.
- Формат данных - текстовый файл: символы новой строки являются разделителями записей.
Одним из возможных улучшений, которое я имел в виду, было разделение файла на файлы, достаточно малые для сортировки в памяти, и, наконец, объединение всех этих файлов с использованием алгоритма, который я описал выше.