2016-12-09 2 views
0

Я пытаюсь понять что-то немного лучше о mmap. Недавно я прочитал эту часть этого принятого ответа на соответствующий StackOverflow вопрос (цит ниже): mmap and memory usageКак mmap() помогает считывать информацию с определенным смещением по сравнению с обычным Posix I/O

Допустим, вы читаете 100MB порцию данных, и в соответствии с первоначальным 1Мб данных заголовка, информации, вы хотите находится на смещении 75MB, так что вам не нужно ничего между 1 ~ 74.9MB! Вы прочитали это для ничего, кроме как сделать ваш код проще. С mmap вы будете только читать данные, к которым вы действительно обращались (округленный 4kb, или OS-страница размер, который в основном 4kb), поэтому он будет читать только первый и 75-й MB.

Я понимаю большую часть преимуществ mmap (нет необходимости в контекстных переключателях, нет необходимости менять содержимое и т. Д.), Но я не совсем понимаю это смещение. Если мы не mmap, и нам нужна информация на 75-м MB-смещении, не можем ли мы сделать это со стандартными вызовами ввода-вывода файлов POSIX без использования mmap? Почему MMAP точно помогает здесь?

+0

'mmap()' имеет тенденцию быть переоцененным решением. Прочитайте [этот пост] (http://marc.info/?l=linux-kernel&m=95496636207616&w=2) сам Линус Торвальдс, который был в ответ на то, что кто-то жалуется, что 'mmap()' доступ к данным занял в три раза больше как просто используя 'read()'. –

ответ

0

Конечно, вы могли бы. Вы всегда можете открыть файл и прочитать только нужные вам порции.

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

С mmap() вы «сопоставляете» весь конкурс файла с смещениями в памяти. Большинство реализаций mmap() делают это лениво, поэтому каждый блок размером ~ 4K читается по запросу при доступе к этим ячейкам памяти.

Все, что вам нужно сделать, это получить доступ к данным в вашем файле, так как это был огромный массив символов (то есть int* someInt = &map[750000000]; return *someInt;), и пусть ОС беспокоится о том, какие части файла были прочитаны, когда читать файл, сколько, записывая грязные блоки данных обратно в файл и очищая память, чтобы освободить оперативную память.

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