ММАП может помочь вам в каком-то смысле, я объясню некоторые гипотетические примеры:
Первое: Допустим, вы работаете из памяти, и ваше приложение, которое имеет 100MB кусок malloc'ed память получает 50% от нее, это означает, что ОС должна была записать 50 МБ в файл подкачки, и если вам нужно его прочитать, вы написали, заняли, а затем снова прочитали 50 Мб вашего файла подкачки.
В случае, если память была только mmap'ed, операционная система не будет записывать эту информацию в файл подкачки (поскольку он знает, что эти данные идентичны самому файлу), вместо этого он просто поцарапает 50 МБ (опять же: предположим, что вы ничего не писали на данный момент), и все. Если вам когда-либо понадобится, чтобы память читалась снова, ОС будет извлекать содержимое не из файла подкачки, а из исходного файла, который вы нарисовали, поэтому, если для любой другой программы требуется 50 Мбайт свопа, они доступны. Также нет накладных расходов при работе с файлами подкачки.
Предположим, вы прочитали блок данных объемом 100 Мбайт, и согласно начальному 1МБ данных заголовка информация, которую вы хотите, расположена со смещением 75 МБ, поэтому вам не нужно ничего между 1 ~ 74,9 МБ! Вы прочитали его только для того, чтобы сделать ваш код более простым. С помощью mmap вы будете только читать данные, к которым вы действительно обращались (округленный 4kb или размер страницы ОС, который в основном составляет 4kb), поэтому он будет читать только первый и 75-й MB. Я думаю, что очень сложно сделать более простой и эффективный способ избежать чтения диска, чем файлы mmaping. И если по какой-то причине вам нужны данные со смещением 37MB, вы можете просто использовать его! Вам не нужно снова копировать его, так как весь файл доступен в памяти (конечно, ограниченным объемом памяти вашего процесса).
Все файлы mmap'ed подкрепляются сами по себе, а не файлом подкачки, файл подкачки предназначен для предоставления данных, у которых нет файла для резервного копирования, обычно это данные malloc'ed или данные, которые поддерживаются но он был изменен и [не может/не должен] быть записан обратно до него, прежде чем программа на самом деле сообщает OS об этом с помощью вызова msync.
Остерегайтесь того, что вам не нужно отображать весь файл в памяти, вы можете сопоставить любую сумму (2-й arg - «size_t length»), начиная с любого места (6-й arg - «off_t offset»), но если ваш файл, вероятно, будет огромным, вы можете безопасно отображать 1 ГБ данных без страха, даже если система упаковывает только 64 МБ физической памяти, но это для чтения, если вы планируете писать, тогда вы должны быть более консервативными и отображать только что вам нужно.
Картографические файлы помогут вам сделать ваш код более простым (у вас уже есть содержимое файла в памяти, готовое к использованию, с гораздо меньшими издержками памяти, поскольку оно не является анонимной памятью) и быстрее (вы будете только читать данные, доступ к программе).
Насколько велик «большой»? Самое главное, как это соотносится с общей реальной ОЗУ на компьютере, где это будет работать? – zwol
Большой - это несколько гигабайт. У меня 24G RAM, поэтому некоторые файлы могут занимать до четверти физической памяти или даже больше. – Elektito
В основном, используя 'mmap()', вы заставляете эту память копировать файл, а не подкачиваться подкачкой (так называемая анонимная память). Под давлением памяти ядро может решить вернуть память с файловой памятью более агрессивно, чем анонимная память, или это может сделать обратное, я не знаю. – ninjalj