Я в основном повторяю ответ Кристиана , но уточняю:
Да, вам нужно делать это более или менее на месте, поскольку у вас мало доступной оперативной памяти. Но наивные сортировки на месте были бы катастрофой только из-за стоимости перемещения строк.
Вместо того, чтобы на самом деле перемещать строки, просто следите за тем, какие строки должны поменяться местами с другими, и фактически переместите их, один раз в конце, к их конечному месту. То есть, если у вас было 1000 строк, создайте массив из 1000 дюймов. массив [i] - это место, где должна заканчиваться строка i. Если массив [17] == 133 в конце, это означает, что строка 17 должна заканчиваться на месте для строки 133. массив [i] == i для всех i, чтобы начать. Таким образом, обмен строк - это всего лишь обмен двух строк.
Тогда любой алгоритм на месте, такой как быстрая сортировка, работает очень хорошо.
Время исполнения, безусловно, определяется окончательным ходом струн. Предполагая, что каждый из них перемещается, вы перемещаете около 100 ГБ данных в записях разумного размера. Я мог бы предположить, что диск / контроллер / ОС может двигаться со скоростью около 100 МБ / с для вас. Итак, 1000 секунд или около того? 20 минут?
Но это умещается в памяти? У вас есть 100 ГБ строк, каждая из которых составляет 256 байтов. Сколько строк? 100 * 2 ^ 30/2 ^ 8 или около 419 миллионов строк. Вам нужно 419 МБ, каждый по 4 байта или около 1,7 ГБ. Вуаля, умещается в ваших 2 ГБ.