2012-01-10 3 views
4

Если я прав, то в Linux (в C/C++, gcc/g++) можно читать данные из обычного файла, используя read(2) или mmap(2) syscalls.Быстрое чтение файлов

Два вопроса. Do read syscall использовать mmap внутренне? Когда первый быстрее второго и наоборот?

+0

«Лучше»? Что лучше"? –

+0

Можете ли вы рассказать нам, насколько велик ваш файл, и сколько у вас файлов? –

+0

Наверное, самое лучшее, что нужно сделать, это попробовать оба метода в любом случае и посмотреть, что быстрее для вашего конкретного использования. Трудно сказать, какой из них может быть быстрее, потому что вы не указали какие-либо свойства файлов, которые вы читаете, например, размер, содержит ли он согласованные данные и т. Д. – dreamlax

ответ

6

Если вы читаете файл последовательно, моим выбором по умолчанию было бы повторно read в довольно большой буфер.

Если вы получаете доступ к небольшим битам данных, разбросанных по большому файлу, выбор менее ясен, но mmap может привести к более читаемому коду (поскольку вы могли бы кодировать вещи так, как если бы файл уже был в памяти). Что даст лучшую производительность в этом случае, сложно сказать априори.

Если вы пишете критически важный для работы код, то единственный способ определить производительность - путем сопоставления/профилирования фактического кода.

+12

На самом деле 'read' абсолютно не может использовать' mmap ', потому что он может работать с файловыми дескрипторами без поиска (например, pipe, tty или socket). – duskwuff

+0

@ duskwuff: Хорошая точка! – Cartesius00

+0

@ duskwuff: Спасибо за это. Я обновил ответ, чтобы включить ваше замечание. – NPE

3

Общее правило:

  • если вы читаете файл последовательно от начала до конца вы можете использовать чтение() без снижения производительности.

  • Если вы читаете файл со случайным доступом, mmap() приведет к лучшей производительности, чем сравнительная комбинация seek()/read().

+0

Что сказал @gravitron. Самый быстрый способ - fstat файл найти его размер, а затем получить вещь в одной операции read(). –

+0

@PeteWilson: Я считаю, что быстрее скопировать файл с помощью флага MAP_POPULATE для Linux или использовать posix_madvise. Это по существу отображает кеш-файл в вашу виртуальную RAM, сохраняя копию. –

+1

@PeteWilson Я согласен с Zan, то, что вы предлагаете, будет страдать от штрафов, если файл имеет достаточный размер, чтобы потребовать, чтобы VM сохранил весь файл. – gravitron

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