Показать сообщение отдельно
  #3  
Старый 30.11.2014, 23:45
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Если это обычный текстовый файл, то структура у него нерегулярная, и результат по-любому придется записывать в другой файл.

Общий алгоритм такой:
  • Отображаем файл на память.
  • Последовательно двигаем окно по файлу, сохраняем в масив или TList триплет (номер окна, смещение, длина строки), то есть индексируем файл.
  • Перемешиваем индексы в массиве.
  • Сохраняем результат, последовательно прыгая окном туда-сюда и сохраняя строки по смещению, согласно индексу.

Если разрабатывать под 64-битную платформу и требовать 25 ГБ свободной памяти, можно за один раз считать файл в память, после чего оперировать указателями и длинами. Номер окна не понадобится из-за отсутствия окон.

Если пытаться решить задачу обычным TStringList, он захочет 50 ГБ ОЗУ из-за особенности реализации TStrings.LoadFromStream.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием