Чтение больших файлов последовательно - PullRequest
3 голосов
/ 20 декабря 2011

Как обработать (только для чтения) большой двоичный файл в C/C++ на Linux как можно быстрее? Через read или mmap? Какой размер буфера? (Без повышения или чего-либо еще.)

Ответы [ 2 ]

6 голосов
/ 20 декабря 2011

mmap быстрее и оптимален для приложений только для чтения. Смотрите ответ здесь:

https://stackoverflow.com/a/258097/1094175

3 голосов
/ 21 декабря 2011

Вы можете использовать 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".

...