Показать сообщение отдельно
  #3  
Старый 08.03.2018, 21:04
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, если исходные файлы большие, то можно сделать алгоритм, который будет читать/писать блоками в несколько итераций.
Примерно так:
1. Считаем солько строк всего в файле. Пусть получили N.
2. Создаем массив длинной N.
3. В цикле от 1 до N генерируем случайную позицию для i-ой строки и помещаем ее в массив. Если место уже занято, то сдвигаем по циклу пока не найдем свободное место.
4. Берем K первых элементов массива, проходимся по файлу и собираем нужные строки, пишем их в выходной файл.
5. Повторяем 4 пока не будут записаны все блоки.
6. Profit...
Получается, что для файла длинной N строк и размера блока K строк у нас будет N%K+2 проходов по файлу.
Т.е. для примера N=1005, K=20 получаем 52 прохода.
Ответить с цитированием