Информация об изменениях

Сообщение Re[3]: Как правильно сортировать содержимое больших файлов? от 21.08.2022 14:22

Изменено 21.08.2022 14:26 Pavel Dvorkin

Re[3]: Как правильно сортировать содержимое больших файлов?
Здравствуйте, _FRED_, Вы писали:

_FR>Хм. У меня в файле на 10 гиг 19,759,295 строк. Получается, файл на 200 гиг может содержать порядка (x20) 395,185,900 строк. Уже, вроде, гига полтора интов.


Тогда на них тоже file mapping. Хотя этого я не делал, за скорость не поручусь.

PD>>Этот массив и сортируем обычной qsort, используя strcmp в качестве int (*compare), так как строка заканчивается '\0'. Если strcmp возвращает 0 для первого критерия, strcmp по второму критерию.


_FR>Исходный файл:

_FR>
_FR>415. Apple
_FR>30432. Something something something
_FR>1. Apple
_FR>32. Cherry is the best
_FR>2. Banana is yellow
_FR>


После преобразования будет

415\0Apple\0
30432\0Something something something\0
1\0Apple\0
32\0Cherry is the best\0
2\0Banana is yellow\0

(точки я убрал, но они погоды не делают)

А массив указателей — на начала каждой исходной строки : p[0] на 415, p[1] на 30432 и т.д.

И тогда p[i] — указатель на число в строке, а p[i] + strlen(числа, оно же текст) — указатель на текстовую часть строки

Ну и все. qsort на этот p. В compare сравниваем как нам надо. Строки не переставляем, только p[i] будут переставлены.
Re[3]: Как правильно сортировать содержимое больших файлов?
Здравствуйте, _FRED_, Вы писали:

_FR>Хм. У меня в файле на 10 гиг 19,759,295 строк. Получается, файл на 200 гиг может содержать порядка (x20) 395,185,900 строк. Уже, вроде, гига полтора интов.


Тогда на них тоже file mapping. Хотя этого я не делал, за скорость не поручусь.

PD>>Этот массив и сортируем обычной qsort, используя strcmp в качестве int (*compare), так как строка заканчивается '\0'. Если strcmp возвращает 0 для первого критерия, strcmp по второму критерию.


_FR>Исходный файл:

_FR>
_FR>415. Apple
_FR>30432. Something something something
_FR>1. Apple
_FR>32. Cherry is the best
_FR>2. Banana is yellow
_FR>


После преобразования будет

415\0Apple\0
30432\0Something something something\0
1\0Apple\0
32\0Cherry is the best\0
2\0Banana is yellow\0

(точки я убрал, но они погоды не делают)

А массив указателей — на начала каждой исходной строки : p[0] на 415, p[1] на 30432 и т.д.

И тогда p[i] — указатель на число в строке, а p[i] + strlen(p[i]) — указатель на текстовую часть строки

Ну и все. qsort на этот p. В compare сравниваем как нам надо. Строки не переставляем, только p[i] будут переставлены.