2011-12-20 7 views
3

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

+0

Последовательный или произвольный доступ? – thiton

ответ

6

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

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

+0

Этот ответ в основном точнее, но бит о том, что «mmap позволяет всем этим процессам совместно использовать одни и те же страницы физической памяти, экономя много памяти», является блоком - кэш файловой системы делает это. –

3

Вы можете использовать madvise с mmap, и вы могли бы также назвать readahead (возможно, в отдельном потоке, так как блокирующий системный вызов).

Если прочитать файл с помощью обычного read(2), рассмотреть возможность использования posix_fadvise(2) и передать буферы 32kbytes в 1Mbytes к read(2) ...

Вызов mmap на достаточно больших регионов; по крайней мере, несколько десятков мегабайт (при условии, что у вас более 1 ГБ ОЗУ), и если у вас много доступной ОЗУ, в больших регионах (до 80% доступной ОЗУ).

Позаботьтесь о границах ресурсов, например. set with 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 -ed с "rm" режим.

Смежные вопросы