У меня большой файл (предположим, я могу сделать его двоичным), который не помещается в ОЗУ, и я хочу отсортировать по нему числа.
Учитывая, что файл является двоичным, возможно, самое простое и предположительно эффективное решение - это карта памяти файла. К сожалению, нет стандартного интерфейса для отображения памяти. В системах POSIX есть функция mmap
.
Теперь отображаемый в память файл представляет собой просто массив необработанных байтов. Считать его массивом целых чисел технически недопустимо до тех пор, пока в C ++ 20 не будет введен C -стиль «неявное создание объектов низкого уровня». На практике это уже работает в большинстве современных реализаций языка Примечание 1 .
Чтобы эта реинтерпретация работала, представление целых чисел в файле должно соответствовать представлению целых чисел, используемому ЦП. , Файл не будет переносимым на ту же программу, работающую в других несовместимых системах.
Мы можем просто использовать std::sort
для этого массива. Операционная система должна позаботиться о подкачке файла в память и из памяти. Однако алгоритм, используемый std::sort
, не обязательно оптимизирован для этого варианта использования. Чтобы найти оптимальный алгоритм, вам может потребоваться провести некоторое исследование.
1 В случае, если проблема касается соответствия стандарту Pre-C ++ 20, можно выполнить итерацию по массиву, скопируйте базовые байты в целое число, поместив новый целочисленный объект в память, используя скопированное целое число в качестве нового значения. Компилятор может оптимизировать эти операции до нуля инструкций, и это делает поведение программы хорошо определенным.