Если это обычный текстовый файл, то структура у него нерегулярная, и результат по-любому придется записывать в другой файл.
Общий алгоритм такой:
- Отображаем файл на память.
- Последовательно двигаем окно по файлу, сохраняем в масив или TList триплет (номер окна, смещение, длина строки), то есть индексируем файл.
- Перемешиваем индексы в массиве.
- Сохраняем результат, последовательно прыгая окном туда-сюда и сохраняя строки по смещению, согласно индексу.
Если разрабатывать под 64-битную платформу и требовать 25 ГБ свободной памяти, можно за один раз считать файл в память, после чего оперировать указателями и длинами. Номер окна не понадобится из-за отсутствия окон.
Если пытаться решить задачу обычным TStringList, он захочет 50 ГБ ОЗУ из-за особенности реализации TStrings.LoadFromStream.