|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Нужно перемешать строки в текстовом файле 25 гб
Всем привет, такая задачка нужно перемешать строки в текстовом файле размером 25 гб порядка 520 млн строк как можно сделать наиболее быстро нужен какой то алгоритм пусть и примитивный но чтобы работал, кто подскажет?
Теоретически алгоритм есть, но незнаю как реализовать технически: 1) Подсчитать количество строк в файле 2) Берем случайные 2 строки из общего количества и меняем их местами. 3) Количество замен нужно как минимум половина от общего кол-во строк / 2 потому что меняем только 2 строки Последний раз редактировалось aquatell, 30.11.2014 в 15:25. |
#2
|
||||
|
||||
Быстро не выйдет по любому ибо читать вы будете текст не последовательно, а произвольно. Как вариант псевдоперемешивания, без потери скорости, предлагаю такой:
- считываем из исходного файла в массив по N строк, затем случайным образом перемешиваем их в массиве и записываем полученный новый набор строк в новый файл. Операцию повторяем до конца исходного файла. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
aquatell (01.12.2014)
|
#3
|
||||
|
||||
Если это обычный текстовый файл, то структура у него нерегулярная, и результат по-любому придется записывать в другой файл.
Общий алгоритм такой:
Если разрабатывать под 64-битную платформу и требовать 25 ГБ свободной памяти, можно за один раз считать файл в память, после чего оперировать указателями и длинами. Номер окна не понадобится из-за отсутствия окон. Если пытаться решить задачу обычным TStringList, он захочет 50 ГБ ОЗУ из-за особенности реализации TStrings.LoadFromStream. Не стоит путать форумы с богадельнями. © Bargest |
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
aquatell (01.12.2014)
|
#4
|
||||
|
||||
Вот попробуйте, не тестировал на очень больших файлах (просто нет таких, а делать лень), но на полумиллионе строк довольно шустро отрабатывает.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Seraphim (10.08.2015)
|