Вы можете использовать madvise с mmap , и вы также можете вызвать readahead (возможно, в отдельном потоке, поскольку это блокирующий системный вызов).
Если вы читаете файл, используя обычное read (2) , рассмотрите возможность использования posix_fadvise (2) и передайте буферы размером 32 Кбайт в 1 Мбайт в read (2) ...
Звоните mmap
по достаточно большим регионам;по меньшей мере несколько десятков мегабайт (при условии, что у вас более 1 ГБ ОЗУ) и, если у вас много доступной ОЗУ, в больших регионах (до 80% доступной ОЗУ).
Позаботьтесь оограничения на ресурсы, например, установленные с помощью setrlimit
Для не слишком больших файлов (и не слишком больших), вы можете mmap
их полностью.Вам нужно будет позвонить, например, stat , чтобы узнать их размер.Как правило, при чтении одного (а не нескольких) больших файлов на моем настольном компьютере я бы mmap
заполнил его полностью, если он меньше 3Gb.
Если важна производительность, найдите время для сравнения производительностиприложение и вашу систему, и настроить его соответственно.Получение настраиваемых параметров (например, размера области mmap) имеет смысл.
Файловая система /proc/
, особенно внутри /proc/self/
из вашего приложения, дает несколько мер (например, /proc/self/status
, /proc/self/maps
, /proc/self/smaps
, /proc/self/statm
и т. Д.)
GNU libc должен использовать mmap
для чтения FILE
с, которые у вас есть fopen
-ед с режимом "rm"
.