Отдельные мысли:
1 Tb / 2 Gb = 500 чисел, не много.
Сначала собрать массив индексов строк в отсортированном порядке.
После окончания сортировки записать финальный файл с реальными числами.
Merge Sort, да, хорош, потому что O(n log n)
Числа – фикс. размера, поэтому для сравнения двух очередных чисел, читать можно от старших регистров к младшим, до первого различия, которое может наступить уже в первых цифрах.
Считывать длинные числа можно маленькими блоками, да хоть по байту (нет), пока не наступит различие в пользу одного из двух.
Все 500 можно считывать маленькими шажками от старших регистров к младшим.
Считали 500 блоков (по килобайту?) – расставили в порядке.
Далее считываем следующие блоки только для тех из 500, что на предыдущем сравнении оказались равными.
И т.д. пока все равенства не разрешатся, или пока числа не кончатся )