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