Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Решал эту задачу в реальном проекте в 2000-е. Но писал на C, поэтому мог позволить себе все. Да и исходный файл делал сам из других данных, так что мог его портить. Кроме того, надо было получить возможность доступа в порядке отсортированности, а собственно передвижение строк не требовалось.
PD>Решение
PD>Открываем file mapping и view на весь файл.
PD>За линейное время проходим весь файл, заменяем разделитель внутри строки на '\0'. Конец строки тоже заменяем на '\0'. Одновременно строим массив указателей (смещение от начала файла + базовый адрес view) для каждой строки.
Хм. У меня в файле на 10 гиг 19,759,295 строк. Получается, файл на 200 гиг может содержать порядка (x20) 395,185,900 строк. Уже, вроде, гига полтора интов.
PD>Этот массив и сортируем обычной qsort, используя strcmp в качестве int (*compare), так как строка заканчивается '\0'. Если strcmp возвращает 0 для первого критерия, strcmp по второму критерию.
Исходный файл:
415. Apple
30432. Something something something
1. Apple
32. Cherry is the best
2. Banana is yellow
после преобразования:
415
Apple
30432
Something something something
1
Apple
32
Cherry is the best
2
Banana is yellow
Если я правильно понял предлагаемый алгоритм, то после сортировки будет:
1
2
30432
32
415
Apple
Apple
Banana is yellow
Cherry is the best
Something something something
И как потом собрать из этого то, что должно получиться в итоге:
1. Apple
415. Apple
2. Banana is yellow
32. Cherry is the best
30432. Something something something

Не расскажете подробнее часть про сортировку, как в ней учесть порядок полей. по которым надо сортировать и как потом собрать результат обратно?