Ответ 1
Считает, что? Каков конечный пункт назначения этих данных?
Поскольку это звучит так, как будто вы полностью привязаны к IO, mmap
и read
не должны иметь значения. Интересная часть заключается в том, как вы получаете данные в приемник.
Предполагая, что вы помещаете эти данные в канал, я рекомендую вам просто выгрузить содержимое каждого файла целиком в трубу. Чтобы сделать это, используя нуль-копию, попробуйте системный вызов splice
. Вы также можете попробовать скопировать файл вручную или развернуть экземпляр cat
или какой-либо другой инструмент, который может сильно загружать текущий файл как stdin, а pipe - как stdout.
if (pid = fork()) {
waitpid(pid, ...);
} else {
dup2(dest, 1);
dup2(source, 0);
execlp("cat", "cat");
}
Update0
Если ваша обработка не зависит от файлов и не требует произвольного доступа, вы хотите создать конвейер, используя параметры, описанные выше. Ваш шаг обработки должен принимать данные от stdin или pipe.
Чтобы ответить на ваши более конкретные вопросы:
A: Может ли файл read() типа read() снова быть оптимизирован за пределами вызовов posix_advise в Linux или настроил планировщик дисков, вызовы VMM и posix_advise - насколько это возможно?
Это так же хорошо, как и говорить о том, что делать с пользовательским пространством. Остальное зависит от вас: буферизация, резьба и т.д., Но это опасная и, вероятно, непродуктивная работа. Я бы просто пошел с сращиванием файлов в трубу.
B: Существуют ли систематические способы для mmap лучше иметь дело с очень большими отображаемыми данными?
Да. следующие параметры могут дать вам потрясающие преимущества в производительности (и может заставить mmap использовать более прочитанное с тестированием):
-
MAP_HUGETLB
Выделите отображение, используя "огромные страницы".Это уменьшит служебные данные пейджинга в ядре, что отлично, если вы будете сопоставлять файлы размера гигабайта.
-
MAP_NORESERVE
Не резервируйте пространство подкачки для этого сопоставления. Когда пространство подкачки зарезервировано, у одного есть гарантия, что можно изменить отображение. Когда пространство подкачки не зарезервировано, вы можете получить SIGSEGV при записи, если физическая память недоступна.Это предотвратит нехватку памяти, сохраняя при этом вашу реализацию простой, если на самом деле у вас недостаточно физической памяти + swap для всего отображения. **
-
MAP_POPULATE
Заполните таблицы страниц (prefault) для отображения. Для сопоставления файлов это вызывает чтение-вперед в файле. Более поздние обращения к отображению не будут блокироваться ошибками страницы.Это может дать вам ускорения с достаточными аппаратными ресурсами, и если предварительная выборка упорядочена и ленива. Я подозреваю, что этот флаг избыточен, VFS, вероятно, делает это лучше по умолчанию.