Russian Qt Forum

Qt => Общие вопросы => Тема начата: kvrus от Июнь 09, 2012, 15:12



Название: Как произвести сортировку строк большого файла
Отправлено: kvrus от Июнь 09, 2012, 15:12
Есть лог файл с датами и сообщениями очень большого размера (~1Гб). Как сделать сортировку
строчек? как то можно его по частям проверять?


Название: Re: Как произвести сортировку строк большого файла
Отправлено: Igors от Июнь 09, 2012, 15:24
Есть лог файл с датами и сообщениями очень большого размера (~1Гб). Как сделать сортировку
строчек? как то можно его по частям проверять?
Выбираете дату "медиану". Создаете 2 файла, в первый пишете все строки меньше медианы, во второй - все что больше. Если получившиеся куски еще слишком велики - делите их рекурсивно. Потом сортируете каждый кусок в памяти и пишете все сортированные куски в новый файл. Возможна ситуация когда память есть (напр 2 Gb) но выделить слишком большой блок все равно не удается - это нормально.

Есть способ и проще

Код
C++ (Qt)
struct CLine {
QDate mDate;
qint64 mFilePos;
};
 
Создаете контейнер таких, сортируете и потом собираете делая seek. Писать меньше но тут предполагается что контейнер влезет в память


Название: Re: Как произвести сортировку строк большого файла
Отправлено: LisandreL от Июнь 09, 2012, 15:26
Если нет запрета на использование промежуточных файлов, то делайте merge sort (http://ru.wikipedia.org/wiki/%D1%EE%F0%F2%E8%F0%EE%E2%EA%E0_%F1%EB%E8%FF%ED%E8%E5%EC).
То есть читаете блок записей, сортируете и сбрасываете результат во временный файл. Потом полученные файлы вместе объединяете сразу все вместе или группами (обычно попарно).


Название: Re: Как произвести сортировку строк большого файла
Отправлено: SimpleSunny от Июнь 10, 2012, 12:59
"внешняя сортировка" -> google


Название: Re: Как произвести сортировку строк большого файла
Отправлено: Igors от Июнь 10, 2012, 13:48
Если уж налицо виртуозное владение гуглой, то позвольте спросить. Вот пишут
Цитировать
Сортируемый массив разбивается на две части примерно одинакового размера;
А как это сделать?

Спасибо


Название: Re: Как произвести сортировку строк большого файла
Отправлено: SimpleSunny от Июнь 10, 2012, 14:50
Если уж налицо виртуозное владение гуглой, то позвольте спросить. Вот пишут
Цитировать
Сортируемый массив разбивается на две части примерно одинакового размера;
А как это сделать?

Спасибо

Кто где пишет?
Внешняя сортировка - это только название класса алгоритмов, далее уже выбирается подходящий под свои нужды.


Название: Re: Как произвести сортировку строк большого файла
Отправлено: Igors от Июнь 10, 2012, 15:19
Кто где пишет?
В авторитетном источнике "Википедия", эту ссылку рекомендовал LisandreL
http://ru.wikipedia.org/wiki/%D1%EE%F0%F2%E8%F0%EE%E2%EA%E0_%F1%EB%E8%FF%ED%E8%E5%EC (http://ru.wikipedia.org/wiki/%D1%EE%F0%F2%E8%F0%EE%E2%EA%E0_%F1%EB%E8%FF%ED%E8%E5%EC)
Там и мувики есть


Название: Re: Как произвести сортировку строк большого файла
Отправлено: SimpleSunny от Июнь 10, 2012, 20:01
Ссылка LisandreL не совсем уместна в данном контексте, так как там рассказыватся про алгоритм сортировки слияниям, а не про слияние отсортированных файлов.